首页 / JAVA / java 多线程 线程池:多核CPU利用ExecutorService newWorkStealingPool; ForkJoinPool线程池 执行可拆分的任务RecursiveAction
java 多线程 线程池:多核CPU利用ExecutorService newWorkStealingPool; ForkJoinPool线程池 执行可拆分的任务RecursiveAction
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java 多线程 线程池:多核CPU利用ExecutorService newWorkStealingPool; ForkJoinPool线程池 执行可拆分的任务RecursiveAction,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3302字,纯文字阅读大概需要5分钟。
内容图文
![java 多线程 线程池:多核CPU利用ExecutorService newWorkStealingPool; ForkJoinPool线程池 执行可拆分的任务RecursiveAction](/upload/InfoBanner/zyjiaocheng/1051/190e97ae69dd4067956964605f94f3e4.jpg)
1,给定并行级别:
- 1,ExecutorService newWorkStealingPool(int parallelism): 创建持有足够的线程的线程池来支持给定的并行级别,该方法还会使用多个队列来减少竞争
- 2,ExecutorService newWorkStealingPool(): 该方法是前面方法的简化版本 如果前机器有4个CPU,则目标并行级别被设置为4
- 这两个方法是Java8新增的,这两个方法可充分利用多 CPU 并行的能力 这两个方法生成的 work stealing 池,都相于后台线程池,如果所有的前台线程都死亡了workstealing 池中的线程会自动死亡。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @ClassName ExecutorsWorkStealingPoolTest * @projectName: object1 * @author : Zhangmingda * @description: XXX * date: 2021/4/27. */ public class ExecutorsWorkStealingPoolTest { public static void main(String[] args) throws InterruptedException { Runnable r = () -> { String tName = Thread.currentThread().getName(); try { System.out.println(tName + "开始运行"); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(tName + "运行结束"); }; /** * 创建支持多核CPU并行的线程池 */ ExecutorService executorService = Executors.newWorkStealingPool(); //译文:Stealing 窃取for (int i=0; i<10; i++){ executorService.submit(r); } System.out.println(Runtime.getRuntime().availableProcessors()); //CPU核心数 Thread.sleep(3000); } }
2、Java8 增强的 ForkJoinPool 用于拆分大的计算任务,拆分为多个小的计算任务
用法:
- 定义可以拆分的任务类,继承RecursiveAction类,实现其抽象方法compute;
- 用自定义任务类,实例化可拆分任务对象;
- 使用ForkJoinPool实例化对象,submit可拆分任务对象;
- ForkJoinPool对象awaitTermination执行任务。
-
使用ForkJoinPool实例化对象.get()方法获取返回值
无返回值示例代码:
要求:给出一个int数据范围,范围内整数个数>100 则拆分不同的线程来打印。每个线程只打印不超过100个整数。
import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveAction; import java.util.concurrent.TimeUnit; /** * @ClassName MyRecursiveAction * @projectName: object1 * @author : Zhangmingda * @description: XXX * date: 2021/4/27. */ public class MyRecursiveAction { /** * 定义一个支持拆分计算的任务 */ private static class PrintTaskRecursiveAction extends RecursiveAction{ privateint start; privateint end; privatefinalint MAXNUM = 100; /** * 构造实例传入任务需要的参数 */public PrintTaskRecursiveAction(int start, int end) { this.start = start; this.end = end; } /** * 具体执行计算的任务的抽象方法重写 */ @Override protectedvoid compute() { String tName = Thread.currentThread().getName(); if ((end - start) < MAXNUM){ System.out.println(tName + " start:" + start); System.out.println(tName + " end:" + end); }else { int middle = (start + end) /2; /** * 大任务拆分为两个小任务, */ PrintTaskRecursiveAction subTask1 = new PrintTaskRecursiveAction(start,middle); PrintTaskRecursiveAction subTask2 = new PrintTaskRecursiveAction(middle,end); //分别执行两个小任务 subTask1.fork();subTask2.fork(); } } } /** 执行计算任务 */publicstaticvoid main(String[] args) throws InterruptedException { ForkJoinPool forkJoinPool = new ForkJoinPool(); PrintTaskRecursiveAction printTask = new PrintTaskRecursiveAction(1,300); //线程池提交任务 forkJoinPool.submit(printTask); forkJoinPool.awaitTermination(1, TimeUnit.SECONDS); //关闭提交接口 forkJoinPool.shutdown(); } }
有返回值示例代码:
要求:计算1~100的和,每个线程计算不超过10个数的和。
原文:https://www.cnblogs.com/zhangmingda/p/14710284.html
内容总结
以上是互联网集市为您收集整理的java 多线程 线程池:多核CPU利用ExecutorService newWorkStealingPool; ForkJoinPool线程池 执行可拆分的任务RecursiveAction全部内容,希望文章能够帮你解决java 多线程 线程池:多核CPU利用ExecutorService newWorkStealingPool; ForkJoinPool线程池 执行可拆分的任务RecursiveAction所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。