多线程中,如何让一个线程先执行才能执行其他线程

本文介绍了一种使用Java的Semaphore类实现多线程间同步的方法。具体案例为:ThreadA负责初始化变量i,完成后通知等待中的ThreadB和ThreadC。通过Semaphore的acquire和release方法,确保了线程间的正确同步。
摘要由CSDN通过智能技术生成

问题描述

ThreadA、ThreadB、ThreadC,ThreadA 用于初始化数据 i,只有当i初始化完成之后再让ThreadB和ThreadC获取到初始化后的变量i。
分析过程如下:
考虑到多线程的不确定性,因此我们不能确保ThreadA就一定先于ThreadB和ThreadC前执行,就算ThreadA先执行了,我们也无法保证ThreadA什么时候才能将变量i给初始化完成。因此我们必须让ThreadB和ThreadC去等待ThreadA完成任何后发出的消息。
现在需要解决两个难题,一是让 ThreadB 和 ThreadC 等待 ThreadA 先执行完,二是 ThreadA 执行完之后给ThreadB和ThreadC发送消息。
解决方案:

是使用纯Java API的Semaphore类来控制线程的等待和释放,

//设置semaphore值,初始值给0
        Semaphore semaphore = new Semaphore(0);
        Thread threadA= new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //模拟耗时操作
                    Thread.sleep(1000);
                    //给定i值
                    i=10;
                    //因为另外有两个线程给定 2
                    semaphore.release(0);
                } catch (InterruptedException e) {
                    System.out.println("A异常"+e);
                    e.printStackTrace();
                }

            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //有值则继续,无则不执行
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("b值i>>>>>>"+i);
            }
        });

        Thread threadC = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //有值则继续,无则不执行
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("值i>>>>>>"+i);
            }
        });
        //三个线程同时执行
        threadA.start();
        threadB.start();
        threadC.start();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值