线程池关闭主要涉及以下几个API:
- shutdown:关闭线程池,此方法执行后,线程池不会立即关闭,1、等待正在执行的线程任务执行完毕 2、等待任务队列中的任务执行完毕,步骤1和2执行后,线程池才完全中止
- isShutdown:判断线程池是否是Shutdown状态,当shutdown方法执行后,isShutdown=true
- isTerminated:判断线程池是否是Terminated状态,当线程池完全中止后,isTerminated=true
- shutdownNow:立即关闭线程池,此方法执行后,1、将正在执行任务的线程中断 2、将任务队列中的任务返回
案例:shutdown
package com.gingko.test;import java.util.List;
import java.util.concurrent.*;public class Test {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(10);for (int i=0;i<100;i++) {//提交100个任务executorService.submit(()->{try {Thread.sleep(500);System.out.println(Thread.currentThread().getName() + "执行任务了");} catch (InterruptedException e) {//e.printStackTrace();System.out.println(Thread.currentThread().getName() + "被中断了...");}});}/*** shutdown:关闭线程池,线程池状态调整为SHUTDOWN,线程池不会立即关闭* 1、等待正在执行的线程任务执行完毕* 2、等待任务队列中的任务执行完毕* 3、1-2执行完毕后,线程池才中止,状态调整为:TERMINATED*/executorService.shutdown();System.out.println("isShutdown:" + executorService.isShutdown());//trueSystem.out.println("isTerminated:" + executorService.isTerminated());//false//已经是SHUTDOWN状态,线程池无法接收新任务,抛出java.util.concurrent.RejectedExecutionExceptionexecutorService.submit(() -> {System.out.println(Thread.currentThread().getName());});}
}
从运行结果可以看出:
- isShutdown返回是true
- isTerminated由于线程池还未完全中止,返回false
- 线程池关闭后,新的任务被拒绝
案例:shutdownNow
package com.gingko.test;import java.util.List;
import java.util.concurrent.*;public class Test {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(10);for (int i=0;i<100;i++) {//提交100个任务executorService.submit(()->{try {Thread.sleep(500);System.out.println(Thread.currentThread().getName() + "执行任务了");} catch (InterruptedException e) {//e.printStackTrace();System.out.println(Thread.currentThread().getName() + "被中断了...");}});}/*** shutdownNow:立即关闭线程池,状态调整为:TERMINATED* 1、正在执行的线程,将其中断* 2、队列中任务,方法原封不动的返回*/List<Runnable> runnables = executorService.shutdownNow();System.out.println("isShutdown:" + executorService.isShutdown());//truetry {Thread.sleep(1500);System.out.println("isTerminated:" + executorService.isTerminated());//sleep了1.5秒,此时线程池已完全中止,true//总共100个任务,10个任务被10个线程获取并执行,但这10个线程在sleep的时候被中断了,剩余90个任务在任务队列中System.out.println("未执行的任务数:" + runnables.size());//90} catch (InterruptedException e) {e.printStackTrace();}}
}
从运行结果可以看出:
- isShutdown返回是true
- isTerminated 主线程等待了1.5秒,此时线程池已完全中止,返回true
- 线程池关闭后,10个正在执行的线程被中断,剩余90个任务队列中的任务被返回