参考Erlang之父用一幅5岁小孩都能看懂的图来解释并发与并行:

Image

从它们的对立面来理解可能更有帮助:
并发的反义词是顺序,concurrency vs sequential
并行的反义词是串行,Parallelism vs Serial

其它关于并发&并行的解释:

并发:指代码逻辑上可以并行,有并行的潜力,但是不一定当前是真的以物理并行的方式运行,并发指的是代码的性质;
并行:指的是物理运行状态。

并发:交替做不同事的能力;
并行:同时做不同事的能力。

并发:不同代码块交替执行的性能;
并行:不同代码块同时执行的性能。

并发和并行都可以是多个线程,就看这些线程能不能同时被(多个)CPU执行,能则是并行。并发是多个线程被(一个)CPU轮流切换着执行。