Thread.stop、Thread.suspend、Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,因为它存在安全隐患。
Java线程一般在执行完run方法就可以正常结束,不过有一类线程叫做伺服线程,不间断地执行,往往在run方法中有一个死循环,监视着某些条件,只有当这些条件满足时才能结束。例:
public void run() {
while(true){
someWork();
if(finished){
break;
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我们可以在while死循环内,每次循环时,察看外部条件,看看是否需要关闭当前线程。如果是,就break,跳出死循环,或者是抛出异常,跳出死循环,结束线程。
有些执行伺服任务的线程,在while(true)这样的死循环内部,是一个阻塞中的方法。此时,就不能采用第二种方法了。因为,当该方法没有返回时,该线程一直处于阻塞当中,根本无法执行其他语句。
此时,就需要调用该线程的interrupt方法,产生一个InterruptedException运行时异常,是阻塞中的那个方法抛出这个异常,从而让我们有机会结束这个线程的执行。
这里说一种特殊情况,有些情况可能你需要一下子停止整个系统的所有线程,这样子上面的方法就不是那么高效,思路也差不多。例如下面的Thread1、Thread2。
public class Thread1 extends Thread {
@Override
public void run() {
while(true) {
try {
doSomeWork();
if (finished) {
break;
}
// wait for some resource
} catch (InterruptedException e) {
// ...
break;
}
}
}
}
public class Thread2 extends Thread {
@Override
public void run() {
while(true) {
try {
doSomeWork();
if (finished) {
break;
}
// wait for some resource
} catch (InterruptedException e) {
// ...
break;
}
}
}
}
显然,通过上面那两种方法不能一下子停止这些线程,因为我们不能做到这些线程能同时满足条件,此外这些线程也不可能一块堵塞。这里我们通过改变whlie条件来解决这个问题,在我们的Thread1、Thread2上面增加一个父类AbstractThread,例:
public abstract class AbstractThread extends Thread {
protected AtomicBoolean isRunning = new AtomicBoolean(true);
public void stopRunning() {
isRunning.set(false);
}
}
然后使Thread1、Thread2继承AbstractThread,然后修改while循环为如下:
while(isRunning) {
...
}
在停止线程时,调用每个线程的stopRunning方法,如果存在堵塞的情况,在辅助调用该线程的interrupt方法。
分享到:
相关推荐
JAVA线程停止的方法
《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口的线程 线程的生命周期 线程命名 ...
代码里面包含一个并发4个线程同时运行 全部开始 全部停止 单个停止还有点问题。 还有生产者消费者 里面的里面能帮助你理解多线程的运用!
java中强制停止线程的Demo 里面有两个Demo
NULL 博文链接:https://lxl13041491.iteye.com/blog/2167118
本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...
java 多线程内容 1. 线程概念 2. 线程的创建和停止 3. 线程的状态
3.1 Java线程 3.2 创建线程 3.3 使用线程的缺点 3.3.1 初始启动变慢 3.3.2 资源利用 3.3.2 资源利用 3.4 线程管理 3.5 共享资源的使用同步 3.5.1 同步方法和同步代码块的嵌套调用...
讲述了让我们头疼的多线程
输入“stop”后,滚动字幕停止;输入“restart”后,滚动字幕重新开始滚动; (3)当用户在“命令”后的文本框中输入“change ”+字符串时,可更改字幕显示内容。如,输入“change 我可爱的小时钟”后,字幕变为“我...
关于线程的动态停止 启动一个或n个线程 动态的卖票。经过一段时间后停止 停止的时间由自己或程序动态给出
在char03包里放置了Java线程间通信的知识的代码。内容如下: 等待/通知机制 join方法的使用 在char04包里放置了Java中Lock类的知识的代码,内容如下: Lock类 Lock类其他功能 Condition类 Condition类其他...
JAVA100例之实例66 实现对线程的控制,中断、挂起、恢复、停止
不客气地说,至少有一半人认为,线程的“中断”就是让线程停止。如果你也这么认为,那你对多线程编程还没有入门。 在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后带来的结果...
主要介绍了java多线程之停止线程的方法实例代码详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
线程被启动以后,自动调用目标对象的run()方法,除非线程被停止。在run()方法的第十一中,Applet重绘本身,然后睡眠1秒,同时要捕获异常事件并进行处理。 如果你离开这一页,程序将调用stop()方法,将线程置空。当你...
Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。即“线程中断”并不是字面意思——线程真的中断了,而是设置了中断标志...
主要介绍了java安全停止线程的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java使用ExecutorService来停止线程服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
联系多线程,学会多线程画图