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); } }
无返回值示例代码:
要求:给出一个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{ private int start; private int end; private final int MAXNUM = 100; /** * 构造实例传入任务需要的参数 */ public PrintTaskRecursiveAction(int start, int end) { this.start = start; this.end = end; } /** * 具体执行计算的任务的抽象方法重写 */ @Override protected void 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(); } } } /** 执行计算任务 */ public static void 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个数的和。
java 多线程 线程池:多核CPU利用ExecutorService newWorkStealingPool; ForkJoinPool线程池 执行可拆分的任务RecursiveAction
原文:https://www.cnblogs.com/zhangmingda/p/14710284.html