> 美食
线程池关闭后执行指定的方法(线程池关闭会关闭线程吗)
导语:线程池关闭
线程池状态RUNNING:正常的状态:接受新的任务,处理等待队列中的任务SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程TIDYING:所有的任务都销毁了,workCount 为 0。线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()TERMINATED:terminated() 方法结束后,线程池的状态就会变成这个 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // COUNT_BITS 设置为 29(32-3),前三位用于存放线程状态,后29位用于存放线程数 // 00000000000000000000000000011101 private static final int COUNT_BITS = Integer.SIZE - 3; // 000 11111111111111111111111111111 // 线程池的最大线程数是 2^29-1=536870911 // 减1之后高三位为 0,其他为1 private static final int CAPACITY = (1 << COUNT_BITS) - 1; // runState is stored in the high-order bits // 线程池的状态存放在高 3 位中 // 11100000000000000000000000000000 private static final int RUNNING = -1 << COUNT_BITS; // 00000000000000000000000000000000 private static final int SHUTDOWN = 0 << COUNT_BITS; // 00100000000000000000000000000000 private static final int STOP = 1 << COUNT_BITS; // 01000000000000000000000000000000 private static final int TIDYING = 2 << COUNT_BITS; // 01100000000000000000000000000000 private static final int TERMINATED = 3 << COUNT_BITS; // Packing and unpacking ctl // & 两个数都为1则为1,否则为0 // 将整数 c 的低 29 位修改为 0,就得到了线程池的状态 // ~CAPACITY 111 00000000000000000000000000000 private static int runStateOf(int c) { return c & ~CAPACITY; } // 将整数 c 的高 3 为修改为 0,就得到了线程池中的线程数 // CAPACITY 000 11111111111111111111111111111 private static int workerCountOf(int c) { return c & CAPACITY; } private static int ctlOf(int rs, int wc) { return rs | wc; }
shutdown()关闭线程池,已提交的任务继续执行,不接受继续提交新任务。
shutdownNow()shutdownNow相对于shutdown的加强版,区别在于它会去停止当前正在进行的任务。
关闭线程池,尝试停止正在执行的所有任务,不接受继续提交新任务。
返回任务队列中正在等待的所有任务转移到一个 List ,此时可以进行其他操作。
判断线程池是否关闭isShutdown()线程是否开始执行了shutdown方法。
当isShutdown返回true并不代表这个线程池是关闭状态了,只代表着线程有没有开始执行线程关闭的方法。
isTerminated()如果调用了 shutdown() 或 shutdownNow() 方法后,所有任务结束了,那么返回true。
这个方法必须在调用shutdown或shutdownNow方法之后调用才会返回true。
awaitTermination()等待所有任务完成,并设置超时时间。
实际应用中是,先调用 shutdown 或 shutdownNow,再调这个方法等待所有的线程真正地完成,返回值意味着有没有超时。
代码shutdown();
List<Runnable> list = shutdownNow() protected void cancelRemainingTask(Runnable task) { if (task instanceof Future) { ((Future<?>) task).cancel(true); }}
private void awaitTerminationIfNecessary(int awaitTerminationSeconds) { if (this.awaitTerminationSeconds <= 0) { return; } try { if (!awaitTermination(this.awaitTerminationSeconds, TimeUnit.SECONDS)) { log.warn(&34;); } } catch (InterruptedException ex) { log.warn(&34;); Thread.currentThread().interrupt(); }}
本文内容由小娴整理编辑!