shutdown方法
1.线程池状态变为shutdown
2.不会接收新任务
3.已提交的任务会执行完
4.此方法不会阻塞调用线程执行
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(() -> {
log.debug("task1 running");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("task1 finished");
});
executorService.submit(() -> {
log.debug("task2 running");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("task2 finished");
});
executorService.submit(() -> {
log.debug("task3 running");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("task3 finished");
});
log.debug("shutdown");
executorService.shutdown();
shutdownNow方法
1.线程池的状态变为STOP
2.不会接受新任务
3.会将队列中的任务返回
4.并用interrupt的方式中断正在执行中的任务
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(() -> {
log.debug("task1 running");
try {
TimeUnit.SECONDS.sleep(2);
log.debug("task1 finished");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
executorService.submit(() -> {
log.debug("task2 running");
try {
TimeUnit.SECONDS.sleep(2);
log.debug("task2 finished");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
executorService.submit(() -> {
log.debug("task3 running");
try {
TimeUnit.SECONDS.sleep(5);
log.debug("task3 finished");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
log.debug("shutdownNow");
//队列中的任务会返回到List<Runnable>集合中
List<Runnable> runnables = executorService.shutdownNow();
log.debug("runnables={}", runnables);
log.debug("other....");
isShutdown方法
只要线程池的状态不是RUNNING, 此方法就返回true。
isTerminated方法
判断线程池的状态是否为TERMINATED。
awaitTermination方法
调用shutdown后,由于调用线程并不会等待所有任务运行结束,因此如果它想在线程池TERMINATED后做些事情,可以利用此方法等待。但是我们并不知道线程池中的任务多久才能全部执行完,也就无法知道awaitTermination方法设置的超时时间是多久。还是可能用submit方法返回的future结果来判定线程池中的每个任务是否执行完毕。
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(() -> {
log.debug("task1 running");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("task1 finished");
});
executorService.submit(() -> {
log.debug("task2 running");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("task2 finished");
});
executorService.submit(() -> {
log.debug("task3 running");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("task3 finished");
});
log.debug("shutdown");
executorService.shutdown();
log.debug("other....");//调用shutdown方法后,主线程不会因为线程池中的线程没有运行结束而阻塞
try {
//如果想等线程池中的线程执行完后做一些后续操作,可以使用awaitTermination方法等待指定时间
//时间等够了也就是超时了,或者线程池中的线程都执行完了,才会继续向下执行
executorService.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("done...");