关闭线程池 shutdown 和 shutdownNow 的区别
共 6566字,需浏览 14分钟
·
2021-10-02 07:41
阅读本文大概需要 4.5 分钟。
前言
如何正确关闭线程池
shutdown 和 shutdownNow 的区别
项目环境
jdk 1.8
github 地址:https://github.com/huajiexiewenfeng/java-concurrent
1.线程池示例
public class ShutDownThreadPoolDemo {
private ExecutorService service = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
new ShutDownThreadPoolDemo().executeTask();
}
public void executeTask() {
for (int i = 0; i < 100; i++) {
service.submit(() -> {
System.out.println(Thread.currentThread().getName() + "->执行");
});
}
}
}
pool-1-thread-2->执行
pool-1-thread-3->执行
pool-1-thread-1->执行
pool-1-thread-4->执行
pool-1-thread-5->执行
pool-1-thread-6->执行
...
void shutdown
boolean isShutdown
boolean isTerminated
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
List
shutdownNow
2.shutdown
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
// 线程池中的线程比核心线程数少
if (workerCountOf(c) < corePoolSize) {
// 新建一个核心线程执行任务
if (addWorker(command, true))
return;
c = ctl.get();
}
// 核心线程已满,但是任务队列未满,添加到队列中
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
// 任务成功添加到队列以后,再次检查是否需要添加新的线程,因为已存在的线程可能被销毁了
if (! isRunning(recheck) && remove(command))
// 如果线程池处于非运行状态,并且把当前的任务从任务队列中移除成功,则拒绝该任务
reject(command);
else if (workerCountOf(recheck) == 0)
// 如果之前的线程已经被销毁完,新建一个非核心线程
addWorker(null, false);
}
// 核心线程池已满,队列已满,尝试创建一个非核心新的线程
else if (!addWorker(command, false))
// 如果创建新线程失败,说明线程池关闭或者线程池满了,拒绝任务
reject(command);
}
3.isShutdown
4.isTerminated
5.awaitTermination
6.shutdownNow
public List<Runnable> shutdownNow() {
List<Runnable> tasks;
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
checkShutdownAccess();
advanceRunState(STOP);
interruptWorkers();
tasks = drainQueue();
} finally {
mainLock.unlock();
}
tryTerminate();
return tasks;
}
7.shutdown 和 shutdownNow 的区别?
shutdown 会等待线程池中的任务执行完成之后关闭线程池,而 shutdownNow 会给所有线程发送中断信号,中断任务执行,然后关闭线程池
shutdown 没有返回值,而 shutdownNow 会返回关闭前任务队列中未执行的任务集合(List)
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
朕已阅