多线程_并发与并行

本文解释了并发和并行的概念,指出并发在单CPU系统中通过时间片分配实现,而并行在多CPU系统中允许多个线程同时执行。通过赛车比赛的示例展示了并发执行的过程,其中AE86和奔驰线程交替执行,模拟了并发竞争直到一方获胜。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值