Thread.stop方法,虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是不受提倡的,不应该使用stop方法来关闭Java的线程。
正确的方法应该是设置volatile boolean stop = false;,这样所有线程可以及时发现stop值的变化,线程运行的过程中周期性或关键点检查stop值,当发现stop被其他线程置为了true时,终止线程的运行。
但是上面的方法也有不完善的地方,当线程wait、sleep等情况下将无法判断stop的值,也就是说线程可能会永远的阻塞下去。所以希望关闭线程,除了周期性或关键点检查stop值,还要调用Interrupt来中断阻塞状态的线程。
即使做了如上的操作,线程可能也不会立即终止,需要等待操作系统调度的结束。
ExecutorService的shutdown是缓慢关闭线程池,无法加入新的任务,shutdownNow是希望立即关闭线程池,shutdownNow中就调用了interrupt,但是调用的是interrupt,也不会立即关闭。
ExecutorService不调用shutdown,将会在所有任务完成后1分钟关闭线程池。
时间: 2024-10-11 06:13:34