线程池用法,Runable和Callable接口使用注意点

Thread Pool

public Map<String, Long> test() {
    ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
            .setNameFormat("www").build();//创建线程工厂
    //创建线程池
    ThreadPoolExecutor executor = new ThreadPoolExecutor(
            5,//1.corePoolSize:线程池中的常驻核心线程数
            5,//2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1
            0L,//3.keepAliveTime:多余的空闲线程的存活时间。
            TimeUnit.MILLISECONDS,//4.unit:keepAliveTime的单位
            new LinkedBlockingQueue<>(1024),//5.workQueue:任务队列,被提交但尚未被执行的任务
            namedThreadFactory,//6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般默认即可
            new ThreadPoolExecutor.AbortPolicy());//7.handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池最大线程数(maximumPoolSize)时如何处理

    //初始化计数器,因为将要开启三个线程所以写3
    CountDownLatch countDownLatch = new CountDownLatch(3);

    //因为多线程所以使用ConcurrentHashMap
    Map<String, Long> map = new ConcurrentHashMap<>();

    //第一个线程
    Runnable labelRunnable = new Runnable() {
        @Override
        public void run() {
            try {
                //业务,查询数量
                LabelQuery labelQuery = new LabelQuery();
                Long num = labelDAO.dynamicSelectCount(labelQuery);

                //收集返回值
                map.put("label", num);
            } catch (DAOException e) {
                e.printStackTrace();
            }finally {
                //计数器减1
                countDownLatch.countDown();
            }
        }
    };

    //第二个线程
    Runnable materialLabelRunnable = new Runnable() {
        @Override
        public void run() {
            try {
                //业务,查询数量
                MaterialLabelQuery materialLabelQuery = new MaterialLabelQuery();
                Long num = MaterialServiceImpl.this.materialLabelDAO.dynamicSelectCount(materialLabelQuery);

                //收集返回值
                map.put("materialLabel", num);
            } catch (DAOException e) {
                e.printStackTrace();
            }finally {
                //计数器减1
                countDownLatch.countDown();
            }
        }
    };

    //第三个线程
    Runnable materialRunnable = new Runnable() {
        @Override
        public void run() {
            //业务,查询数量
            try {
                MaterialQuery materialQuery = new MaterialQuery();
                Long num = materialDAO.dynamicSelectCount(materialQuery);

                //收集返回值
                map.put("material",num);
            } catch (DAOException e) {
                e.printStackTrace();
            }finally {
                //计数器减1
                countDownLatch.countDown();//因为初始话计数器为3,现在计数器为0;所以当前线程结束,允许提交,计数器不为0则不能提交
            }
        }
    };

    //CallAble接口
    Callable<Long> homeMaterialCallable = new Callable<Long>() {
        @Override
        public Long call() throws Exception {
            return homeMaterialDAO.dynamicSelectCount(new HomeMaterialQuery());
        }
    };

    Callable<Long> carLabelMaterialCallable = new Callable<Long>() {
        @Override
        public Long call() throws Exception {
            return carLabelMaterialDAO.dynamicSelectCount(new CarLabelMaterialQuery());
        }
    };

    //获取Callable返回值
    FutureTask<Long> homeMaterial = new FutureTask<>(homeMaterialCallable);
    FutureTask<Long> carLabelMaterial = new FutureTask<>(carLabelMaterialCallable);

    //开启线程
    executor.submit(homeMaterial);
    executor.submit(carLabelMaterial);

    executor.execute(labelRunnable);
    executor.execute(materialLabelRunnable);
    executor.execute(materialRunnable);

    try {
        //收集返回值
        map.put("homeMaterial",homeMaterial.get());
        map.put("carLabelMaterial",carLabelMaterial.get());
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        executor.shutdown();
    }

    try {
        //等待计数器为0时或者1s后才能继续往下走;
        countDownLatch.await(1, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }finally {
        //关闭线程池
        executor.shutdown();
    }
    return map;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值