java线程池之newCachedThreadPool

Posted 胡乐天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java线程池之newCachedThreadPool相关的知识,希望对你有一定的参考价值。

newCachedThreadPool测试类

package com.thread.pool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestCachedThreadPool {

    public static void main(String[] args) {
        /**
         * 此方法调用(有两种,此处写无工厂的): new ThreadPoolExecutor(0, Integer.MAX_VALUE,
         *                                       60L, TimeUnit.SECONDS,
         *                                       new SynchronousQueue<Runnable>());
         *
         *  可以看到,核心线程数为0,最大线程数为整数的最大值,
         *  空闲线程空闲时间为60s
         *
         *  new SynchronousQueue():这里是new了一个特殊的队列,
         *      它的特别之处在于内部没有容器,当A线程将任务放入到队列时,如果当前没有对应线程池中的线程来获取该任务,则A线程进行等待
         *      等待线程池新产生一个线程来获取该任务,则唤醒A线程,然后新线程获取该任务(即任务数据传递)
         *
         *  根据线程池的执行顺序得知,当有新任务时,由于核心线程数为0(假设此时线程池内没有线程),会将新任务放入到队列中
         *  此时,立即去创建新线程,新线程接收该任务并执行,执行完毕后,继续存活,若60s内没有新任务,则该线程销毁。
         *
         *  此种线程池适用于负载较轻的场景,执行短期异步任务
         *  这样可以使任务得到快速执行,并且因为任务时间短暂,可以很快执行完成,也不会造成cpu过度切换
         */
        ExecutorService executor = Executors.newCachedThreadPool();
        for(int i = 0; i<10;i++){
            Thread thread = new Thread(new ThreadPool(""+i));
            executor.execute(thread);
        }

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //第二次创建线程任务时,由于第一次创建的十个线程都执行完成了,那么接下来的使用的还是对应的十个线程
        for(int i = 0; i<10;i++){
            Thread thread = new Thread(new ThreadPool(""+i));
            executor.execute(thread);
        }

        executor.shutdown();
    }
}

线程任务类

package com.thread.pool;

import java.util.Date;

public class ThreadPool implements Runnable {

    private static ThreadPool threadPool = null;
    String name;

    public ThreadPool(String name){
        this.name = name;
    }
    @Override
    public void run() {
        doSomeThing();
    }

    public static synchronized Runnable getInstance(){
        if(threadPool == null){
            threadPool = new ThreadPool("getInstance");
        }
        return getInstance();
    }

    private void doSomeThing() {

        for (int i=0;i<10;i++){
            System.out.println((new Date()).toLocaleString() + "   " + Thread.currentThread().getName() + "执行" +i + ",name=" + name);
        }

       /* try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
    }
}

以上是关于java线程池之newCachedThreadPool的主要内容,如果未能解决你的问题,请参考以下文章

java线程池之ThreadPoolExecutor

java线程池之newSingleThreadExecutor

Java线程池之ForkJoinPool

java线程池之newCachedThreadPool

java线程池之newFixedThreadPool

Java 线程池之FixedThreadPool(Java代码实战-003)