滚动新闻

「漫画」并发编程之线程的中止

被废弃的方法stop

阅读JDK中Thread的源码,我们发现,Thread已经为我们提供了suspend()、resume()和stop()三个方法,分别代表暂停、恢复和停止线程Thread。

以suspend()方法为例,在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易引发死锁问题。

同样,stop()方法在终结一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。

举个简单的例子,某个线程正在读写大小为10M的文件,当写到3M时,我们调用了stop方法来强行停止线程,于是线程迅速退出,这个文件就变成了一个未写完的文件,当其他线程尝试利用这个文件时,就会产生不能预料到的异常。

正因为suspend()、resume()和stop()方法带来的副作用,这些方法才被标注为不建议使用的过期方法。

安全的中止线程

比如以下代码:

但是当我们执行这段程序时,会发现,其实子线程endThread并不会停止自己的工作,而是在继续运行。

当我们调用某个线程A的interrupt()方法,对线程进行中断。

好比其他线程对A线程打了个招呼,“A,你要中断了”,不代表线程A会立即停止自己的工作,同样的A线程完全可以不理会这种中断请求。

A线程必须通过检查自身的中断标志位是否被置为true来进行响应。

线程可以通过方法isInterrupted()来进行判断是否被外界要求中断,当检查到了中断标志位被修改为true后,线程就可以决定下一步的工作,是继续运行还是做些清理工作后退出执行。

同时,在JDK中,另外也提供了静态方法Thread.interrupted()来进行判断当前线程是否被外界要求中断,但是大家要注意,Thread.interrupted()在检测中断标志位。