点击领取优惠~
353 字
2 分钟
怎么安全停止一个线程任务?原理是什么?线程池里有类似机制吗?
怎么安全停止一个线程任务?原理是什么?线程池里有类似机制吗?
终止线程
1、使用violate boolean变量退出标志,使线程正常退出,也就是当run方法完成后线程终止。(推荐)
2、使用interrupt()方法中断线程,但是线程不一定会终止。
3、使用stop方法强行终止线程。不安全主要是:thread.stop()调用之后,创建子线程的线程就会抛出ThreadDeatherror的错误,并且会释放子线程所持有的所有锁。
终止线程池
ExecutorService线程池就提供了shutdown和shutdownNow这样的生命周期方法来关闭线程池自身以及它拥有的所有线程。
- shutdown关闭线程池
线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
- shutdownNow关闭线程池并中断任务
终止等待执行的线程,并返回它们的列表。试图停止所有正在执行的线程,试图终止的方法是调用Thread.interrupt(),但是大家知道,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。
怎么安全停止一个线程任务?原理是什么?线程池里有类似机制吗?