Ref
https://www.zhihu.com/question/33515481
https://blog.csdn.net/java_zero2one/article/details/51477791
综述
并发的关键是你有没有处理多任务的能力,不一定要同时。并行的关键是你有没有同时处理多个任务的能力。
在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过程中的某个状态(new,ready,running,blocked,dead)。
如果程序能够并行执行,那么就一定是运行在多核处理器上。此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时运行。
并发指的是代码的性质,并行指的是物理运行状态。
Concurrent并发
同时存在,不一定同时运行。例如两条队列交替使用同一个咖啡机。如图所示,并发即多个线程交替使用cpu时间片运行。
Parallel 并行
同时运行,例如两条队列使用两台咖啡机。线程同时运行在多核处理器的不同核上。
用图理解
Erlang 之父 Joe Armstrong