码迷,mamicode.com
首页 > 编程语言 > 详细

线程池

时间:2019-04-29 19:28:44      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:cut   catch   dex   队列大小   提交   测试   try   添加   lin   

线程池相关类

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();
            }
        }
    }
}

测试结果

技术图片

 

线程池

标签:cut   catch   dex   队列大小   提交   测试   try   添加   lin   

原文地址:https://www.cnblogs.com/moris5013/p/10791966.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!