在 Java 中,并发、并行和串行是三个常见的概念,它们描述了程序中任务执行的不同方式。虽然它们之间存在某些相似之处,但它们的实现和用途有显著的区别。
1. 串行 (Serial)
串行是指任务按照顺序一个接一个地执行,前一个任务完成后再执行下一个任务。它是最简单的执行方式。
-
特点:
- 一个任务在另一个任务之前执行。
- 只有一个任务在某个时间点执行。
- 没有任务的并行处理,完全按顺序执行。
这里写一个示例:
java">public class SerialExample {public static void main(String[] args) {task1(); // 执行任务1task2(); // 执行任务2}public static void task1() {System.out.println("Task 1 is executing");}public static void task2() {System.out.println("Task 2 is executing");}
}
2. 并发 (Concurrency)
并发是指多个任务在同一时间段内开始执行,但并不是完全同时进行。它意味着程序中可能有多个任务,但它们并不是同时执行的,而是通过切换线程或任务的执行,给用户“同时进行”的感觉。
-
特点:
- 任务是交替执行的,可能会通过时间片轮转来模拟并行。
- 操作系统和 JVM 可以切换多个线程,使得多个任务在同一时间段内得到处理。
- 并发并不意味着任务是同时执行的,只是任务被交替执行。
-
示例:
java">public class ConcurrencyExample {public static void main(String[] args) {Thread t1 = new Thread(() -> task1());Thread t2 = new Thread(() -> task2());t1.start(); // 启动线程1t2.start(); // 启动线程2}public static void task1() {System.out.println("Task 1 is executing");}public static void task2() {System.out.println("Task 2 is executing");} }
-
适用场景:
- 当任务需要等待其他资源(例如 I/O 操作)时,可以利用 CPU 空闲时间来执行其他任务。
- 任务之间是独立的,但需要同时进行。
3. 并行 (Parallelism)
并行是指多个任务真正同时执行。在多核处理器或多处理器系统中,任务会在不同的 CPU 核心上同时执行,从而减少总体执行时间。
-
特点:
- 任务真正同时执行,可以在多个 CPU 核心上同时进行。
- 提升了程序执行的效率,特别是对于计算密集型任务。
-
示例:
java">public class ParallelExample {public static void main(String[] args) {ForkJoinPool forkJoinPool = new ForkJoinPool();forkJoinPool.submit(() -> {task1(); // 并行执行任务1});forkJoinPool.submit(() -> {task2(); // 并行执行任务2});forkJoinPool.shutdown();}public static void task1() {System.out.println("Task 1 is executing");}public static void task2() {System.out.println("Task 2 is executing");} }
-
适用场景:
- 任务是计算密集型的,可以通过多个 CPU 核心同时执行来加速处理。
- 需要显著减少任务的执行时间。
区别总结
特性 | 串行 (Serial) | 并发 (Concurrency) | 并行 (Parallelism) |
---|---|---|---|
执行方式 | 一个接一个顺序执行 | 任务交替执行,通过多线程模拟 | 任务真正同时执行,多个线程或 CPU 核心 |
任务依赖性 | 任务之间可能有依赖 | 任务可能是独立的,交替执行 | 任务独立,完全并行执行 |
实现方式 | 单线程,按顺序执行 | 多线程,但任务不是完全同时执行 | 多线程或多进程,任务同时执行 |
适用场景 | 简单任务,顺序执行 | 任务之间相互独立,需要多任务 | 计算密集型任务,充分利用多核 |
性能影响 | 执行慢,受限于单核处理 | 可能提高效率,但受限于单核 | 大幅提升执行效率,减少时间 |
总结
- 串行:任务按顺序执行。
- 并发:多个任务交替执行,通过线程调度模拟“同时”进行。
- 并行:多个任务真正同时执行,通常需要多核或多处理器支持。