Thread.interrupt之误区

            1中断线程

当线程的run方法执行到最后一句,或者执行return语句返回,或者出现没有捕获的异常的时候,线程将终止。看API中早期的stop方法已经过时了,所以弃用它。

Thread.interrupt方法只是用来请求终止一个线程,对正在运行的线程只是将中断的标记置为true,对于阻塞的线程来说,只是让阻塞尽快结束。

当调用Thread.interrupt方法时,如果线程正在运行,这个方法只是将中断状态置为true ,不能真正的停止一个正在运行的线程。但是可以通过判断这个标记来终止一个线程。例如while(!Thread.currentThread().isInterrupted){

do something

}

对于线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,我们可以通过捕获 InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。

        2线程的中断和停止

       Thread.interrupt()方法是让一个线程中断,对于正在运行的线程,只是做了一个标记,将中断置置为true,对于阻塞的线程,抛出InterruptedException,并把中断标记置为false.

对于下面的代码

 void myTask{

...

try{

sleep(delay)

}catch(InterruptedException e){

}

...

}

这段代码是没有更大的意义的,因为捕获到异常之后中断标记被置为false了

最好采用下面的两种方法来实现,


void myTask{

...

try{

sleep(delay)

}catch(InterruptedException e){

Thread.currentThread().inturrept();/设置状态,/调用的人可以对它进行检测

}

...

}

或者直接抛出异常是最好的方式

void myTask throws InterruptedException{

...

sleep(delay);

...

}

 

3如果要终止线程,最好的办法是通过通过共享变量中断线程,停止线程的执行。

                       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值