线程池

Posted moris5013

tags:

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

线程池相关类

ExecutorService , 线程池接口

Executors   线程池工具类,可以生成不同类型的线程池,

        Executors.newFixedThreadPool(3); //固定数量的线程池   corePoolSize=maximumPoolSize=3
        Executors.newCachedThreadPool(); //缓存线程池corePoolSize =0,maximumPoolSize=Integer.MAX_VALUE,
        Executors.newSingleThreadExecutor();//单线程池 corePoolSize=maximumPoolSize=1
        Executors.newScheduledThreadPool(3); //支持定时或者周期性任务执行
        Executors.newWorkStealingPool(); //支持并行执行任务
 Executors.newFixedThreadPool(3);调用的是new ThreadPoolExecutor

技术图片

所以ThreadPoolExecutor线程池的真正实现类

向线程池提交任务

带返回值

技术图片

不带返回值

技术图片

execute(Runnable) 内部的逻辑

技术图片

 

    1.如果当前线程池内线程数量小于corePoolSize 数量,会创建一个新的线程,去执行该任务
    2.如果线程内线程数大于corePoolSize,则会将任务 提交到 workQueue(阻塞队列)。通过offer方法添加,会立即返回是否添加成功
    3.如果workQueued队列已经满了,而当前线程池内线程数量小于maximumPoolSize ,
      则创建一个新的线程执行该任务,如果当前线程池内线程数量大于maximumPoolSize数量,则执行拒绝策略
    

 测试execute方法

public class TestExecute {

    public static void main(String[] args) throws InterruptedException {
        
        LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(5);
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 3, TimeUnit.SECONDS, queue); // 默认直接抛出异常
        for (int i = 1; i <= 17; i++) {
            Thread.sleep(10);
            threadPool.execute(new Thread(new MyRunnable(), "Thread—Pool-".concat(i + "")));
            System.out.println(" index = "+ i+" ,  线程池的线程数量: " + threadPool.getPoolSize());
            if (queue.size() > 0) {
                System.out.println("----------------任务队列大小" + queue.size());
            }
        }
        threadPool.shutdown();
        System.out.println("*********");
    }

    public static class MyRunnable implements Runnable {
        @Override
        public void run() {
            try {
                //休眠300毫秒
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

测试结果

技术图片

 

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

Java——线程池

Motan在服务provider端用于处理request的线程池

Java线程池详解

Java线程池详解

Java 线程池详解

线程池-实现一个取消选项