专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java并发编程(8):Executor框架 - 可扩展线程池WorkStealingPool

temp10 2024-11-23 22:33:55 java教程 13 ℃ 0 评论

newWorkStealingPool 是 Java 8 引入的一种线程池,专门用于处理 大规模并行任务。它创建的线程池实现了 工作窃取算法,能够充分利用多核 CPU 的性能。其核心实现依赖于 ForkJoinPool,允许任务之间的相互窃取,提升任务处理效率。

特点:

  • 适合任务量大、相互独立的并行计算任务。
  • 线程池中的每个工作线程有自己的任务队列,当某个线程完成自己的任务时,可以窃取其他线程队列中的任务进行处理。
  • newWorkStealingPool 默认使用系统的可用处理器核心数来决定并发线程数,即 Runtime.getRuntime().availableProcessors()。

使用示例

import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class WorkStealingPoolExample {
    public static void main(String[] args) {
        // 创建一个WorkStealingPool,默认使用可用处理器数量
        ExecutorService executorService = Executors.newWorkStealingPool();

        // 创建多个任务
        List<Callable<String>> tasks = List.of(
            () -> {
                Thread.sleep(1000); // 模拟任务执行
                return "Task 1";
            },
            () -> {
                Thread.sleep(500);
                return "Task 2";
            },
            () -> {
                Thread.sleep(800);
                return "Task 3";
            },
            () -> {
                Thread.sleep(300);
                return "Task 4";
            }
        );

        try {
            // 提交任务并获取结果
            List<Future<String>> results = executorService.invokeAll(tasks);

            // 打印任务结果
            for (Future<String> result : results) {
                System.out.println(result.get());
            }
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        } finally {
            executorService.shutdown();
        }
    }
}

代码说明:

  • Executors.newWorkStealingPool():创建一个 ForkJoinPool 实现的线程池,默认线程数量为系统可用处理器核心数。
  • invokeAll(tasks):提交一组 Callable 任务,并返回任务结果的 Future 列表。
  • 每个任务会分配给不同的工作线程。如果某个线程的任务执行完毕,会尝试从其他线程的队列中“窃取”任务执行。

适用场景:

  • 需要执行大量并行任务,且任务之间相互独立。
  • 适合 CPU 密集型计算任务,充分利用多核 CPU 的性能。

注意事项:

  • 由于是基于 ForkJoinPool 实现的,所以和 ForkJoinTask 配合使用效果更好。
  • 任务的相互独立性非常重要,避免出现任务之间的依赖。

Java并发编程(8):Executor框架 - 可扩展线程池WorkStealingPool

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表