java8 新线程池 newWorkStealingPool

java8 中新增线程池

大家好,偶然间在论坛发现大家对于 java8 中新增的线程池说明的比较少(可能是应用的比较少)以至于可能好多人都不知道这个新的线程池的存在,所以想要发一片文章想要说明下。

新的改变

java8 中创建了一个新的具有抢占式操作的线程池,每个线程都有一个任务队列存放任务。

区别

看过源码的同学都知道之前的线程池都是通过 ThreadPoolExecutor 创建出来的。而创建参数中有一个队列参数用于存放任务。而这些队列的长度都是Integer的最大值。这就导致在实际应用中会造成内存溢出情况。这也是为什么阿里巴巴 java 手册不允许使用 Executors 创建线程池的原因。

而 1.8中新增的线程池是基于ForkJoinPool 的扩展.算法思想就是窃取算法。大概的意思就是将任务按照工作线程均分。然后先工作完的线程去帮助没处理完的线程工作。以实现最快完成工作。(大概就是这个意思了)所以它适合处理很耗时的线程。而具体实现跟之前的线程池没啥太大区别

代码示例

       //创建一个具有抢占式操作的线程池 1。8 之后新增 每个线程都有一个任务队列存放任务
        ExecutorService executorService5 = Executors.newWorkStealingPool(Runtime.getRuntime().availableProcessors());
        LinkedBlockingDeque<Future<String>> strings = new LinkedBlockingDeque<>();
		// CPU 核数
        System.out.println(Runtime.getRuntime().availableProcessors());
		CountDownLatch countDownLatch = new CountDownLatch(Runtime.getRuntime().availableProcessors());

        for (int i = 0; i < Runtime.getRuntime().availableProcessors()+1; i++) {
            Future<String> submit = executorService5.submit(new Callable<String>() {
                @Override
                public String call() {
                    //System.out.println("展示线程:" + Thread.currentThread().getName());
                    try {
                        TimeUnit.SECONDS.sleep(2);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally {
                        //countDownLatch.countDown();
                    }
                    return "展示线程:" + Thread.currentThread().getName();
                }
            });
            strings.offer(submit);
        }

       // countDownLatch.await();

        System.out.println("over");
        executorService5.shutdown();

        strings.forEach(f-> {
            try {
                System.out.println(f.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        });

说明上述代码中线程池的大小采用实际硬件 cpu 大小就好。创建的多了也不会有更多的线程同时工作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值