up:: 线程池Executors工具类提供的4种自动创建线程池的策略

说明:

(1) 介绍与停止线程池相关的五个方法:shutdown(),isShutdown(),isTerminated(),awaitTermination(),shutdownNow();


一:与停止线程池,相关的五个方法;

1.shutdown方法:关闭线程;

(1)shutdown方法,简述;

(1) shutdown方法是关闭线程池;

(2) 但是,执行完这个方法后,线程池不一定会立即停止;

● 这是因为,shutdown只是初始化整个关闭过程;

● 比如,线程池在执行到一半时,线程中有正在执行的任务,队列中也可能有等待被执行的任务;所以,不是我们调用shutdown方法后,整个线程池就能停的;

● 在我们调用了shutdown方法后,线程池就知道了【我们想要停止线程池的意图】;这个时候,为了安全起见,线程池会把正在执行的任务及队列中等待执行的任务都执行完毕后,再去关闭;

● 自然,在我们调用了shutdown方法后,如果还有新的任务过来,线程池就会拒绝;


(2)shutdown方法,演示;

 
     package threadPool;
 
     import java.util.concurrent.ExecutorService;
     import java.util.concurrent.Executors;
 
     /**
      * 演示关闭线程池的shutdown方法;
      */
     public class ShutDown {
         public static void main(String[] args) throws InterruptedException {
             ExecutorService executorService = Executors.newFixedThreadPool(10);
             for (int i = 0; i <1000 ; i++) {
                 executorService.execute(new ShutDownTask());
             }
             Thread.sleep(1500);
             executorService.shutdown();
             executorService.execute(new ShutDownTask());
         }
     }
 
 
     class ShutDownTask implements Runnable{
         @Override
         public void run() {
             try {
                 Thread.sleep(500);
                 System.out.println(Thread.currentThread().getName());
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
 
         }
     }

说明:

(1) 逻辑说明;

(2) 运行效果;

(3) 但是,我们调用shutdown方法关闭线程后,如果线程无法立即关闭;难道,我们只有通过【向线程池添加任务的方式】才能看到shutdown确确实实被执行了吗?:显然不,下面将要介绍的isShutdown方法,可以实现这个需求;

2.isShutdown方法:查看线程池是否已进入停止状态了;

如果,我们执行了shutdown方法,isShutdown方法就会返回true;

说明:

(1) 还是强调一下:我们执行了shutdown方法,isShutdown方法就会返回true;isShutdown方法返回true,仅仅代表线程池处于停止状态了,不代表线程池彻底停止了(因为,线程池进入停止状态后,还要等待【正在执行的任务以及队列中等待的任务】都执行完后,才能彻底终止);

(2) 那么怎么看,线程池是否彻底停止了呐?:下面要讲的isTerminated()方法,可以实现这个需求;

3.isTerminated方法:查看线程池是否已经彻底停止了;


4.awaitTermination方法:判断在等待的时间内,线程池是否彻底停止;

(1) 这个方法,仅仅是用来检测,在设置的等待时间内,线程池是否彻底停止了;

(2)【awaitTermination方法,能否可以去调用】和【有没有调用shutdown】没有关系;换句话说,我们无论有没有执行shutdown,都可以调用awaitTermination;


5.shutdownNow方法:无论线程池中是否有剩余任务,立刻彻底停止线程池;

(1) 那么,此时正在执行任务的线程会被中断;队列中正在排队的任务,会返回;


运行结果: