目录
在一个线程T1中如何优雅停止线程T2,这里的优雅指的是给T2一个料理后事的机会
错误思路:
使用stop(),stop会真正杀死线程,如果这时线程锁住了共享资源,name当他被杀死后就再也没有机会释放锁,其他线程将永远无法获取锁,
使用System.exit(int)方法停止线程
目的是停止一个线程,但这种做法会让整个程序都停止
interrupt
可以打断睡眠线程,运行线程
打断处于阻塞状态线程(sleep,wait,join)
打断阻塞线程会抛出一个interruptedexception异常,抛出异常线程就停止了
如果线程被打断,打断标记就为true,但是对于sleep,wait,join,以异常方式提醒被打断,并且打断标记置为false
打断标记可用来去判断线程被打断后是继续运行还是就此终止
首先, 线程中会有一个中断标记的boolean值,记录当前线程是否打断,这只是一个标记值,并不会实际影响程序的运行,如果需要中断线程,需要自己手动操作。我自己初始化了A,B两个线程,A线程循环每2秒睡眠一次。B线程调用A线程的引用,执行interrupt方法,B想打断A这个线程,A线程的中断标记值设为true。
这时A线程会抛出InterruptedException异常,抛出异常后中断标记值会立即设为false。这里大家需要注意,B的本意是要打断A,让它中断,但你抛出异常后立即把中断标记设为了false,这相当于擅自改变了B的本意,所以需要在catch的代码块中加一行代码:Thread.currentThread().interrupt();来保证A线程的中断标记为true,是B想要的中断状态。
这只是一种规范操作,实际情况应该自己把握。
打断正常运行的线程不会清空打断状态
打断后状态标志位为true
可判断状态标志位进行选择性终止
线程中断与终止
线程中断仅仅是置线程的中断状态位,并不会停止线程。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,比如sleep、join等,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常,并且将中断标志重新置为false。所以在Java中设置线程的中断状态位并不会产生对线程运行的实际影响,而是通过监视线程的状态位并做相应处理,或者通过抛出中断异常(InterruptedException)来通知用户进行处理。
当调用线程的start方法之后,线程会开始驱动任务,当任务执行完毕之后(也就是run方法执行结束)线程将终止,但是如果因为线程阻塞或者线程长时间执行而不能结束,所以我们希望能够通过某种途径可以终止线程以达到想要的效果,常用的方式有两种:中断、检查中断。