Java并行和并發有什么區別?
并行和并發是兩個在多線程編程中經常使用的概念,它們描述了不同的多任務處理方式。
-
并發(Concurrency):
- 定義:并發是指多個任務共享資源,但是并不一定同時執行。它強調的是多個任務之間有交替的執行,通過任務切換來實現。
- 目的:提高系統的效率,充分利用 CPU 時間片,使得多個任務看起來是同時在執行。
下面是一個簡單的并發示例,使用 Java 的
Thread
類:public class ConcurrencyExample {public static void main(String[] args) {Runnable task = () -> {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + ": " + i);}};Thread thread1 = new Thread(task);Thread thread2 = new Thread(task);thread1.start();thread2.start();} }
在這個例子中,兩個線程共享同一個任務,并發地執行。輸出結果可能是交替的,因為兩個線程在運行時會交替執行。
-
并行(Parallelism):
- 定義:并行是指多個任務同時執行,每個任務獨占一個 CPU 核心。它強調的是多個任務在同一時刻同時執行,實現真正的并行計算。
- 目的:提高系統的處理能力,通過同時處理多個任務來加速整體計算。
下面是一個簡單的并行示例,使用 Java 的
ForkJoinPool
:import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask;public class ParallelismExample {static class SumTask extends RecursiveTask<Integer> {private static final int THRESHOLD = 2;private int[] array;private int start;private int end;public SumTask(int[] array, int start, int end) {this.array = array;this.start = start;this.end = end;}@Overrideprotected Integer compute() {if (end - start <= THRESHOLD) {int sum = 0;for (int i = start; i < end; i++) {sum += array[i];}return sum;} else {int middle = (start + end) / 2;SumTask leftTask = new SumTask(array, start, middle);SumTask rightTask = new SumTask(array, middle, end);leftTask.fork();int rightResult = rightTask.compute();int leftResult = leftTask.join();return leftResult + rightResult;}}}public static void main(String[] args) {ForkJoinPool forkJoinPool = new ForkJoinPool();int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int sum = forkJoinPool.invoke(new SumTask(array, 0, array.length));System.out.println("Sum: " + sum);} }
在這個例子中,
ForkJoinPool
實現了并行計算,通過拆分任務進行遞歸處理。這種方式可以利用多個 CPU 核心同時進行計算,實現并行性。
總的來說,并發強調任務之間的交替執行,而并行強調任務的同時執行。在實際的應用中,這兩者可以結合使用,根據任務的性質和系統的硬件情況選擇合適的策略。