线程池停止 3种方法
ExecutorService 接口种的方法
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
shutdown
- 调用这个方法不是彻底的关闭线程池
- 在任务在执行一半的时候,或者在队列种还有任务为执行,执行这个方法。他会将把所有任务都执行完了之后才会停止。
如何知道线程是否停止
isShutdown(); 如果此执行程序已关闭,则返回true 。
shutdownNow();
这个方法就很暴力直接 停止线程池
isTerminated()
线程池时候彻底停止
awaitTermination()
检查线程池 是否在指定时间停止
线程池停止之后不可以在向线程池中提交任务
上代码演示
public class ShutdownPool {
@SneakyThrows
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0, size = 1000; i < size; i++) {
executorService.execute(new Task());
}
executorService.shutdownNow();
System.out.println(executorService.awaitTermination(2L, TimeUnit.MINUTES));
}
}
class Task implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"业务代码哈哈");
}
}
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);
}
线程池中的五种状态
private static final int RUNNING = -1 << COUNT_BITS; 可以执行和接受新的任务
private static final int SHUTDOWN = 0 << COUNT_BITS; 不接受新任务,可以执行已经存在的任务
private static final int STOP = 1 << COUNT_BITS; 不接受,也不执行已经存在的任务
private static final int TIDYING = 2 << COUNT_BITS; 所有任务停止后 执行钩子方法
private static final int TERMINATED = 3 << COUNT_BITS; 钩子方法停止后 彻底停止