• 自定义线程池


    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.*;
    import java.util.concurrent.atomic.AtomicInteger;
    
    public class ProducerConsumer {
        private final static Logger logger = LoggerFactory.getLogger(ProducerConsumer.class);
        /**
         *  球的容器(原始的)
         */
        private static List<String> balls = new ArrayList<>(15);
    
        private  static  ConcurrentLinkedQueue<String> ballsEx = new ConcurrentLinkedQueue<String>();
    
        /**
         *  球的容器(处理过的)
         */
        private static List<String> ballsDone = new ArrayList<>(15);
    
        /**
         * 通过自定义ThreadFactory设置线程的名称; (便于在调试的时候识别它们)
         */
        static class RobotMainThreadFactory implements ThreadFactory {
            private AtomicInteger count = new AtomicInteger(0);
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                String threadName = "moveball_" + count.addAndGet(1);
                t.setName(threadName);
                return t;
            }
        }
    
        /**  任务线程池 **/
        private static ThreadPoolExecutor threadPool = null;
        private static void createThreadPool(){
            int maximumPoolSize = 5;
            threadPool = new ThreadPoolExecutor(maximumPoolSize,  maximumPoolSize,  24L,
                    TimeUnit.HOURS, new ArrayBlockingQueue<Runnable>(maximumPoolSize + 2),
                    new RobotMainThreadFactory());
            RejectedExecutionHandler handler = new RejectedExecutionHandler() {
                @Override
                public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                    logger.error("主线程池已满, 无法添加任务: " + r.toString());
                }
            };
            threadPool.setRejectedExecutionHandler(handler);
            logger.info("成功创建线程池 robotMainThreadPool.");
        }
    
        public static void main(String[] args) throws InterruptedException {
            balls.add("aa");
            balls.add("bb");
            balls.add("cc");
            balls.add("dd");
            balls.add("ee");
            balls.add("ff");
            balls.add("gg");
            balls.add("hh");
            balls.add("ii");
            createThreadPool();
    
            for(int i=0; i <= 4; i++) {
                Runnable task = new Runnable() {
                    @Override
                    public void run() {
                        while (balls.size() != 0) {
                            String oneBall = "";
                            ballsEx.poll();
    
                            synchronized (balls) {
                                oneBall = balls.get(0);
                                balls.remove(0);
                            }
                            if(oneBall.length() == 0) {
                                break;
                            }
                            logger.info("我在搬运小球:" + oneBall);
                            synchronized (ballsDone) {
                                ballsDone.add(oneBall);
                            }
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                };
                threadPool.execute(task);
            }
    
            Thread.sleep(5000);
    
            System.out.println(balls.size() + " , " + ballsDone.size());
    
        }
    
    }
  • 相关阅读:
    Wannafly #4 F 线路规划
    PKUWC2018 随机算法
    noip模拟赛
    php 正则判断是否是手机号码 最新
    Onethink上传服务器后登录不了的问题
    【php中的curl】php中curl的详细解说
    50种网站引流量方式
    mysql ERROR 1045 (28000): 错误解决办法
    织梦DEDE分类信息实现联动筛选(支持多条件多级选项)解决方案
    dedecms新增联动类别后的使用方法
  • 原文地址:https://www.cnblogs.com/mihich/p/13306681.html
Copyright © 2020-2023  润新知