多线程_并发与并行

注:文中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;
    }
}

多线程_并发与并行_第1张图片

你可能感兴趣的:(多线程,java,并发,并行,并发实例)