Java 是一种目前比较流行的后端编程语言,因为其强大的并发性能,使其成为开发多线程应用程序的绝佳选择。Java 中简化并发管理和执行任务过程的两个关键组件是 ExecutorService 和 Fork/Join 框架。在本文中,我们将探讨这两个框架,并以简单易懂的方式对它们进行讲解。
ExecutorService
ExecutorService 就像一组工作者(线程)的管理器,可以帮助你以受控的方式并发执行任务。它抽象化了管理线程的大部分复杂性。让我们举一个简单的例子来说明它的用法。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorServiceExample {
public static void main(String[] args) {
// Create an ExecutorService with a fixed pool of 4 threads
ExecutorService executorService = Executors.newFixedThreadPool(4);
// Submit tasks for execution
for (int i = 0; i {
System.out.println("Task " + taskNumber + " is running on thread " + Thread.currentThread().getName());
});
}
// Shutdown the ExecutorService when done
executorService.shutdown();
}
}
在这个例子中,我们:
1.ExecutorService使用 . 创建一个具有 4 个线程的固定池Executors.newFixedThreadPool(4)。
Fork/Join Framework
Fork/Join Framework 是一种更专业的并行处理工具。它非常适合需要将大型任务划分为较小的子任务,然后合并其结果的情况。让我们通过一个经典的例子来了解它--计算数组中元素的总和。
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;
public class ForkJoinExample {
public static void main(String[] args) {
int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
ForkJoinPool pool = new ForkJoinPool();
int result = pool.invoke(new SumTask(data, 0, data.length));
System.out.println("Sum: " + result);
}
}
class SumTask extends RecursiveTask {
private int[] data;
private int start;
private int end;
public SumTask(int[] data, int start, int end) {
this.data = data;
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
if (end - start