注:文中CPU均指单核CPU
并发:
当存在多个线程时,若系统仅有一个CPU,则根本不可能真正地同时进行一个以上的线程,系统只能把CPU的运行时间划分为若干个时间段,再将时间段分配给各个线程。在一个线程在其时间段执行时,其余线程处于挂起状。这种方式我们称之为并发(Concurrent)。
并行:
若系统拥有一个以上CPU时,则存在多个线程时可并行执行。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行。这种方式我们称之为并行(Parallel)。
区别:
并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序可被分配到多个处理机上,实现并行执行,即利用多个处理机来处理一个可并发执行的程序,如此,多个线程可实现真正意义上的同时执行。
并发实例:赛车
//AE86和奔驰赛跑
public class Race implements Runnable{
private static String winner;
public void run() {
for (int i = 1; i <= 100; i++) {
//当一方已跑了一百公里成为了胜利者 另一方线程中的for循环也会终止
if (GameOver(i)) break;
//模拟奔驰熄火
if (Thread.currentThread().getName().equals("奔驰") && i % 10 == 0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "跑了" + i + "公里");
}
}
public static void main(String[] args) {
new Thread(new Race(), "AE86").start();
new Thread(new Race(), "奔驰").start();
}
boolean GameOver(int steps){
//已存在胜利者
if (winner != null){
return true;
}else {
if (steps>=100){
winner = Thread.currentThread().getName();
System.out.println("winner is " + winner);
return true;
}
}
return false;
}
}