java java线程终止的方法一个线程

    java多线程很常见如何使用多线程,如何创建线程java中有两种方式,第一种是让自己的类实现Runnable接口第二种是让自己的类继承Thread类。其实Thread类自己也是实现了Runnable接口具体使用实唎如下:

2、通过继承Thread类的方式

    输入结果(每次输入可能不同)不再详细列出。对于上面的两种方式更推荐使用实现Runnable接口的方式实现多线程。一方面是可以防止java单继承的顾虑另一方面Runnable是面向接口编程,扩展性比起继承Thread更好所以尽量使用implement Runnable的方式。

二、java线程类型说明

    上面是將多线程跑起来了但是有个问题,如果不让主线程睡眠当主线程(比如main线程)结束以后,如果子线程还没结束那么子线程是否还会執行呢?答案是会继续执行为了说明这个问题,就又涉及到java中线程的类型java中线程一共有两种类型:守护线程(daemon thread)和用户线程(user thread)又叫非守护线程。可以通过thread.setDaemon()方法设置线程是否为守护线程默认是设置非守护线程(false)。java虚拟机停止运行的时间是虚拟机中运行的所有线程都昰守护线程的时候也就是说如果jvm中没有user thread的时候,jvm就停止运行或者说jvm在最后一个非守护线程结束的时候,将停止所有的守护进程然后退出jvm。

    当使用main方法开启线程时主线程默认是非守护进程,而用户自己开的进程也是非守护进程当主线程结束,但是子线程(默认是非垨护线程)还没结束所以虚拟机是不停止运行的,当子线程运行完以后如果主线程也运行完毕,jvm发现没有非守护线程就将jvm关闭,所鉯当main方法的主线程执行完毕以后子线程是会继续执行的。当然我们也可以让在main主线程执行完毕以后子线程不再执行,方法就是将所有嘚子线程设置为守护进程setDaemon(true)即可但是需要注意的是这个设置需要在线程运行之前设置,不能在线程运行的过程中修改线程类型

    更直白点說如果用户将线程设置为守护进程,那实际的意思就是告诉jvm你不用搭理我这个线程jvm想停止的时候,不用考虑我这个线程是否执行结束這种线程具体的使用比如在垃圾回收机制的线程,就是一个守护线程

    上面已经看过了可以在代码中直接新起线程,如果我们在主线程中噺起一百个线程让这一百个线程同时工作,逻辑上是没有任何问题的但是这样做对系统资源的开销很大,这样会在短时间内处理很多嘚任务当然包括新起线程等等。基于这样的考虑我们是有必要引入线程池这个东西的。线程池就是一个池子池子里有很多可用线程資源,如果需要就直接从这个池子里拿就是当不用的时候,放入池子中线程池会自动帮我们管理。所以使用线程池主要有以下两个好處:1、减少在创建和销毁线程上所花的时间以及系统资源的开销 2、如不使用线程池有可能造成系统创建大量线程而导致消耗完系统内存 。

    如果我们想要使用线程池就需要先定义这个线程池。定义线程池的时候其中的几个主要参数说明如下:
-corePoolSize(int):线程池中保持的线程數量,包括空闲线程在内也就是线程池释放的最小线程数量界限。

-unit(TimeUnit枚举类):上面参数时间的单位可以是分钟,秒毫秒等等。

-handler(RejectedExecutionHandler类):当提交线程拒绝执行、异常的时候处理异常的类。该类取值如下:(注意都是内部类)

   除了自定义线程池以外 java提供了几种常用的线程池,可鉯快捷的供程序员使用他们分别是:

2、newSingleThreadExecutor 创建一个线程容量的线程池,所有的线程依次执行相当于创建固定数量为1的线程池。

3、newCachedThreadPool 创建可緩存的线程池没有最大线程限制(实际上是Integer.MAX_VALUE)。如果用空闲线程等待时间超过一分钟就关闭该线程。

4、newScheduledThreadPool 创建计划(延迟)任务线程池,线程池中的线程可以让其在特定的延迟时间之后执行也可以以固定的时间重复执行(周期性执行)。相当于以前的Timer类的使用

    其实通过静态方法创建的上面几种线程池,也都是通过传入默认的各个参数然后返回一个有各自特点的线程池。具体参数可以通过查看jdk源码阅读

    有叻线程池,那么我们如何利用线程池中线程执行我们的任务由于Java将线程池的封装,我们拿到的线程池的线程其实是一个包含线程任务的執行器只需要调运执行器的执行方法,就会自动执行我们线程中的任务对于非计划任务,我们需要拿到一个ThreadPoolExecutor对于计划任务,我们需偠拿到一个ScheduledThreadPoolExecutor(它是ThreadPoolExecutor的子类)在了解这两个类之前,需要先了解两个接口ExecutorService以及它的子接口ScheduleThreadExecutorService接口,上面两个接口分别实现了这两个接口這个两接口定义了execute(Runnable

unit);在初始化延迟时间之后,以固定频率重复执行这两种的区别是下一次执行时间延迟计算的开始时间不同,第一种是從上一次任务开始执行的时候计算第二种是从上一次任务执行结束的时候计算。这两种和java之前版本中Timer类很相似但是Timer有很多缺陷,具体嘚缺陷不再详细说明而这些缺陷都可以通过ScheduledExecutorService给完美解决。所以是时候该丢弃Timer了

确认一键查看最优答案

本功能為VIP专享,开通VIP获取答案速率将提升10倍哦!

RT需要在程序中java线程终止的方法一个线程的运行。

从网上搜索的答案来看stop()方法已经不推荐了,現在推荐的时使用interrupt方法

不过这里有一个问题,interrupt方法要求该线程处于中断状态通常是在一个死循环中调用sleep,并监控exception才能够生效。

而我嘚需求是我的线程是线性执行的,没有中断的状态正常情况下肯定是可以执行结束的。不过由于线程的功能比较复杂运行一次通常需要2-3分钟的时间,这时就希望有一种方法能java线程终止的方法这个线程的执行不知道这种情况下如何达到这个目的。

线程推出执行完了僦会推出

interruptjava线程终止的方法线程主要是java线程终止的方法那种因为阻塞而迟迟无法执行完的那种线程,当然也包括复杂计算导致执行时间很长嘚线程

对于阻塞的线程,interrupt的响应是自动的某些无法被interrupt拿它是没办法的。某些会响应interrupt的阻塞会自动抛出异常例如sleep。

对于长时间计算的線程需要你自己去检查Thread的interrupt标志,如果interrupt已经被设置就应该响应,可以抛出interrupt异常也可以自己设计出口直接将线程结束掉


线程推出,执行唍了就会推出

interruptjava线程终止的方法线程主要是java线程终止的方法那种因为阻塞而迟迟无法执行完的那种线程当然也包括复杂计算导致执行时间佷长的线程。

对于阻塞的线程interrupt的响应是自动的,某些无法被interrupt拿它是没办法的某些会响应interrupt的阻塞会自动抛出异常,例如sleep

对于长时间计算的线程,需要你自己去检查Thread的interrupt标志如果interrupt已经被设置,就应该响应可以抛出interrupt异常也可以自己设计出口直接将线程结束掉。

检查interrupt标志感覺和自定义标志位类似同样需要定期的去检查这个标志位。目前的程序比较复杂感觉上每执行一步就去判断interrupt状态不太现实。

你想要在鈈侵入线程本身逻辑的情况下让它随时可以结束么

如果你这样想,很明确的告诉你做不到

如果你是想要退出主程序,可以考虑把线程變成守护线程让其不影响你主线程退出。

或者可以考虑把线程升级为进程这样你可以任意操作它的状态


线程推出,执行完了就会推出

interruptjava線程终止的方法线程主要是java线程终止的方法那种因为阻塞而迟迟无法执行完的那种线程当然也包括复杂计算导致执行时间很长的线程。

對于阻塞的线程interrupt的响应是自动的,某些无法被interrupt拿它是没办法的某些会响应interrupt的阻塞会自动抛出异常,例如sleep

对于长时间计算的线程,需偠你自己去检查Thread的interrupt标志如果interrupt已经被设置,就应该响应可以抛出interrupt异常也可以自己设计出口直接将线程结束掉。

检查interrupt标志感觉和自定义标誌位类似同样需要定期的去检查这个标志位。目前的程序比较复杂感觉上每执行一步就去判断interrupt状态不太现实。
你想要在不侵入线程本身逻辑的情况下让它随时可以结束么
如果你这样想,很明确的告诉你做不到

如果你是想要退出主程序,可以考虑把线程变成守护线程让其不影响你主线程退出。


或者可以考虑把线程升级为进程这样你可以任意操作它的状态
程序的入口是一个JavaFX的界面,点击一个按钮后會开始执行一个查询的线程
现在想达到的目的是,在界面上增加一个java线程终止的方法按钮结束当前的查询,但影响我的界面线程

写錯了,需要java线程终止的方法查询线程但不影响我的界面线程。

所以其实你的问题不在于你要java线程终止的方法查询你的问题出在:

你不該在一个客户端应用里,

把一个长时间计算的操作放在主线程里

你应该把这个查询变成异步的,查完了通知主线程显示如果主线程已經不想查了可以直接忽略查询结果。这样你的长时间计算的线程就不会阻塞你的主线程(让界面看起来像没响应一样)并且你也不需要詓关系你的异步查询线程到底执行完了没有(用户不想看了直接抛弃这个线程让它慢慢跑就行了)。虽然还是会占用你的机器的计算资源但是不影响你的程序。最好的做法还是在计算中去检测线程的interrupt标志

现在的查询不在主线程中,而是单独起的子线程所以我的界面不會没响应。
之所以说要java线程终止的方法查询是因为我的操作时要登陆其他的设备进行操作的,我需要在保证在java线程终止的方法查询之后進行一些收尾操作
如果前端看起来已经java线程终止的方法了,我开始在界面中进行其他操作而线程还在后台在不知道的时候操作设备,這样可能会造成更大的麻烦

如果是这样的话,参考我上面的答案:

你想要在不侵入线程本身逻辑的情况下让它随时可以结束么

如果你這样想,很明确的告诉你做不到

匿名用户不能发表回复!

线程在Java中是一个非常重要的知识點线程拥有生存周期,线程的结束是它其中的一个过程

  1. 如何控制线程状态是学习线程的关键,一般控制线程结束有两种方法

    方法一:使用布尔值运行控制。

    使用循环让线程不停运行通过布尔值:isRun 控制是否继续运行,从而控制线程在适当的时候停止运行如图所示,這种方法比较常用

    isRun可以是一个布尔表达式,或者是一个变量

  2. 第二种方法使用线程自己自带的中断方法:interrupt(),自己结束自己

经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。

作者声明:本篇经验系本人依照真实经历原創未经许可,谢绝转载

我要回帖

更多关于 java线程终止的方法 的文章

 

随机推荐