java

位置:IT落伍者 >> java >> 浏览文章

Java中断线程的方法


发布日期:2020年05月04日
 
Java中断线程的方法

Threadstop Threadsuspend Threadresume 和RuntimerunFinalizersOnExit 这些终止线程运行的方法已经被废弃使用它们是极端不安全的!

现在如果你要安全有效地终止一个线程应该采用以下这些方法

线程正常执行完毕正常结束

也就是让run方法执行完毕该线程就会正常结束

监视某些条件结束线程的不间断运行

然而常常有些线程是伺服线程它们需要长时间的运行只有在外部某些条件满足的情况下才能关闭这些线程

通常它们执行在一个while(true)的死循环中

如:

publicvoid run() {

while(true){

someWork();

if(finished){

break;

}

try {

Threadsleep();

} catch (InterruptedException e) {

/* TODO自动生成 catch 块

*

*/

eprintStackTrace();

}

}

}

我们可以在while死循环内每次循环时察看外部条件看看是否需要关闭当前线程如果是就break跳出死循环或者是抛出异常跳出死循环结束线程

捕获InterruptedException 运行时异常中断当前线程

有些执行伺服任务的线程在while(true)这样的死循环内部是一个阻塞中的方法此时就不能采用第二种方法了因为当该方法没有返回时该线程一直处于阻塞当中根本无法执行其他语句

此时就需要调用该线程的interrupt方法产生一个InterruptedException运行时异常是阻塞中的那个方法抛出这个异常从而让我们有机会结束这个线程的执行

publicvoid run() {

while(true){

try {

// getSendMessages 是BlockingQueue类它的take方法将会阻塞!

responseMessage = thisgetSendMessages()take();

} catch (InterruptedException e) {

thrownew RuntimeException();

//或者break;

}

someWork();

}

一个外部的Thread 对象 指向这个线程 需要结束这个线程时只需要调用thread对象的interrupt() 方法就会在responseMessage = thisgetSendMessages()take()

这条语句中产生一个InterruptedException异常从而结束该线程的阻塞状态通过抛出异常或者break跳出死循环结束这个线程

上一篇:Java 线程缺陷和副作用的解决办法(2)

下一篇:在Java平台上进行多线程编程的缺陷[1]