up:: 线程池Executors工具类提供的4种自动创建线程池的策略
说明:
(1) 介绍与停止线程池相关的五个方法:shutdown(),isShutdown(),isTerminated(),awaitTermination(),shutdownNow();
一:与停止线程池,相关的五个方法;
1.shutdown方法:关闭线程;
(1)shutdown方法,简述;
(1) shutdown方法是关闭线程池;
(2) 但是,执行完这个方法后,线程池不一定会立即停止;
● 这是因为,shutdown只是初始化整个关闭过程;
● 比如,线程池在执行到一半时,线程中有正在执行的任务,队列中也可能有等待被执行的任务;所以,不是我们调用shutdown方法后,整个线程池就能停的;
● 在我们调用了shutdown方法后,线程池就知道了【我们想要停止线程池的意图】;这个时候,为了安全起见,线程池会把正在执行的任务及队列中等待执行的任务都执行完毕后,再去关闭;
● 自然,在我们调用了shutdown方法后,如果还有新的任务过来,线程池就会拒绝;
(2)shutdown方法,演示;
说明:
(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) 那么,此时正在执行任务的线程会被中断;队列中正在排队的任务,会返回;
运行结果: