概述
停止线程池的方法有两种一种是
1、shutdown()方法
方法定义:public void shutdown()
(1)线程池的状态变成SHUTDOWN状态,此时不能再往线程池中添加新的任务,否则会抛出RejectedExecutionException异常。
(2)线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
注意这个函数不会等待提交的任务执行完成,要想等待全部任务完成,可以调用:
public boolean awaitTermination(longtimeout, TimeUnit unit)
2、shutdownNow()方法
方法定义:public List<Runnable> shutdownNow()
(1)线程池的状态立刻变成STOP状态,此时不能再往线程池中添加新的任务。
(2)终止等待执行的线程,并返回它们的列表;
(3)试图停止所有正在执行的线程,试图终止的方法是调用Thread.interrupt(),但是大家知道,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。
3.、awaitTermination(longtimeout, TimeUnit unit) 方法
public boolean awaitTermination(longtimeout, TimeUnit unit)
这会阻塞线程,直到所有任务完成执行或达到指定的超时:
public void awaitAfterShutdown(ExecutorService threadPool) {
threadPool.shutdown();
try {
if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {
threadPool.shutdownNow();
}
} catch (InterruptedException ex) {
threadPool.shutdownNow();
Thread.currentThread().interrupt();
}
}
最后
以上就是超帅草丛为你收集整理的线程池没有关闭造成主线程没有退出问题的全部内容,希望文章能够帮你解决线程池没有关闭造成主线程没有退出问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复