并发(Concurrency)和并行(Parallelism)

目录

什么是并发(Concurrency)?

1.1 并发的定义

1.2 并发的特点

1.3 并发的代码示例

什么是并行(Parallelism)?

2.1 并行的定义

2.2 并行的特点

2.3 并行的代码示例

并发 vs 并行

总结


什么是并发(Concurrency)?

1.1 并发的定义

并发指的是多个任务交替执行,看起来像是同时进行,但实际上是通过快速切换任务来实现的。就像你一边吃饭一边看电视,虽然你不可能同时做两件事,但你可以快速切换注意力。

在程序中,并发通常用于提高资源利用率,让多个任务共享CPU时间片。

1.2 并发的特点

  • 任务交替执行:多个任务轮流使用CPU。

  • 单核或多核:并发可以在单核CPU上实现。

  • 提高响应性:让程序看起来像是同时处理多个任务。

1.3 并发的代码示例

/**
 * 作者:十五001
 *
 */
public class ConcurrencyExample {
    public static void main(String[] args) {
        Runnable task1 = () -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("任务1: " + i);
                try {
                    Thread.sleep(100); // 模拟耗时操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        Runnable task2 = () -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("任务2: " + i);
                try {
                    Thread.sleep(100); // 模拟耗时操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        Thread thread1 = new Thread(task1);
        Thread thread2 = new Thread(task2);

        thread1.start();
        thread2.start();
    }
}

输出结果:

任务1: 0
任务2: 0
任务1: 1
任务2: 1
任务1: 2
任务2: 2
...

解释:

  • 任务1和任务2交替执行。

  • 虽然只有一个CPU核心,但通过快速切换任务,看起来像是同时运行。

什么是并行(Parallelism)?

2.1 并行的定义

并行指的是多个任务真正同时执行,通常需要多核CPU的支持。就像你和朋友一起打扫房间,你擦桌子,他拖地,两个人同时工作。

在程序中,并行用于提高计算性能,充分利用多核CPU的能力。

2.2 并行的特点

  • 任务同时执行:多个任务真正同时运行。

  • 多核CPU:并行需要多核CPU的支持。

  • 提高性能:通过同时执行多个任务来加快处理速度。

2.3 并行的代码示例

 

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

/**
 * 作者:十五001
 *
 */
public class ParallelismExample {
    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();

        pool.invoke(new RecursiveAction() {
            @Override
            protected void compute() {
                Runnable task1 = () -> {
                    for (int i = 0; i < 5; i++) {
                        System.out.println("任务1: " + i);
                        try {
                            Thread.sleep(100); // 模拟耗时操作
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };

                Runnable task2 = () -> {
                    for (int i = 0; i < 5; i++) {
                        System.out.println("任务2: " + i);
                        try {
                            Thread.sleep(100); // 模拟耗时操作
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };

                invokeAll(new RecursiveAction() {
                    @Override
                    protected void compute() {
                        task1.run();
                    }
                }, new RecursiveAction() {
                    @Override
                    protected void compute() {
                        task2.run();
                    }
                });
            }
        });
    }
}

输出结果:

任务1: 0
任务2: 0
任务1: 1
任务2: 1
任务1: 2
任务2: 2
...

解释:

  • 任务1和任务2同时执行。

  • 需要多核CPU的支持,才能真正实现并行。

并发 vs 并行

特性并发(Concurrency)并行(Parallelism)
执行方式任务交替执行任务同时执行
CPU核心单核或多核多核
目标提高资源利用率,增强响应性提高计算性能
适用场景I/O密集型任务(如网络请求、文件读写)计算密集型任务(如数据分析、图像处理)

总结

  • 并发:就像一个人快速切换任务,适合提高响应性和资源利用率。并发非常适合处理I/O密集型任务,比如网络请求、文件读写等。这些任务大部分时间都在等待外部设备的响应,所以通过并发可以让CPU在等待期间切换到其他任务,提高效率。

  • 并行:就像多个人同时工作,适合提高计算性能。并行非常适合处理计算密集型任务,比如矩阵运算、数据分析等。这些任务需要大量的计算资源,通过并行可以将任务分解到多个核心上,加速计算过程。

  • 想象一下你在看电影。并发就像是你在看电影的同时,不停地切换频道,虽然看起来像是同时在看多个频道,但实际上你只是在快速切换。而并行就像是你和朋友一起看不同的电影,你们真正地同时在看不同的内容。虽然并发和并行是不同的概念,但它们并不是完全独立的。实际上,它们可以结合在一起使用。比如,你可以通过并发来管理多个任务,然后在并行的环境下让这些任务真正地同时运行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十五001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值