CachedThreadPool

 

/**
 * CachedThreadPool 
 * 可缓存的线程
 * 当有个请求进入线程池内, 线程池将会启用一个线程
 * 当再次有个请求进入线程池内, 并且上个线程未结束, 仍然会启用一个线程
 * 当有线程执行完毕后,这个线程不会被清除, 而是被缓存,当有请求进入时, 直接使用缓存线程调用
 * 跟 fixedThreadPool 类似, 只不过没有上限(最多Integer最大值), 是一种弹性操作
 * 当线程一直不被使用, 缓存最多持续1分钟(AliveTime默认值),就会被线程池销毁
 * 
 * 内部是 DelayedWorkQueue
 */
public class T08_CachedThreadPool {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        // pool size 为0
        System.out.println(service); // java.util.concurrent.ThreadPoolExecutor@7f31245a[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]cu'

        for (int i = 0; i < 2; i++) {
            service.execute(() -> {
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            });
        }
        // pool size 变为2 
        System.out.println(service); // java.util.concurrent.ThreadPoolExecutor@7f31245a[Running, pool size = 2, active threads = 2, queued tasks = 0, completed tasks = 0]


        try {
            TimeUnit.SECONDS.sleep(80); // 最多持续1分钟,这里sleep80s
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // pool size 变为0
        System.out.println(service); // java.util.concurrent.ThreadPoolExecutor@7f31245a[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 2]

    } 
}

 

posted @ 2019-10-22 14:44  我爱si搬砖  阅读(557)  评论(0编辑  收藏  举报