• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

三个线程a、b、c并发运行,b,c需要a线程的数据怎么实现(semaphore.acquire()方法和per ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
public class ThreadCommunication {
    /**
     * 三个线程a、b、c并发运行,b,c需要a线程的数据怎么实现
     *
     * 根据问题的描述,通过三个线程,ThreadA ThreadB ThreadC
     * ThreadA用于初始化数据num,只有num初始化完成之后再让ThreadB和ThreadC获取到初始化的变量num。
     *
     *
     * 分析过程如下:
     * 考虑到线程的不确定性,因此我们不能确保ThreadA就一定先于ThreadB和ThreadC前执行,就算
     * ThreadA先执行了,我们也无法保证ThreadA什么时候才能将变量num初始化完成。因此我们必须让
     * ThreadB和ThreadC去等待ThreadA完成任务后发出的消息
     *
     * 解决两个问题:
     * 1:让ThreadB和ThreadC先执行完
     * 2:ThreadA执行完之后给ThreadB和ThreadC发送消息
     */
    /**
     * 两种解决方案
     * 1、使用纯Java API的Semaphore类来控制线程的等待和释放
     * 2、使用Android提供的消息机制
     */

    //定义一个变量作为数据
    private static int num;

    public static void main(String[] args) {
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //模拟耗时操作之后初始化变量num
                    Thread.sleep(1000);
                    num=1;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"获取到num的值为:"+num);
            }
        });
        Thread threadC = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"获取到num的值为:"+num);
            }
        });
        //同时开启三个线程
        threadA.start();
        threadB.start();
        threadC.start();
    }
}

 运行结果:

Thread-2获取到num的值为:0
Thread-1获取到num的值为:0

解决方案1:

  

public class ThreadCommunication {
    /**
     * 三个线程a、b、c并发运行,b,c需要a线程的数据怎么实现
public class ThreadCommunication {

    //定义一个变量作为数据
    private static int num;
    /**
     * 定义一个信号量,该类内部维持了多个线程锁,可以阻塞多个线程,释放多个线程
     * 线程的阻塞是和释放是通过permit概念来实现的
     * 线程通过semaphore.acquire()方法获取permit,如果当前线程有permit则分配给该线程
     * 如果没有则阻塞该线程直到semaphore
     * 调用release()方法释放permit
     * 构造函数中参数:permit(允许)个数;
     */
    private static Semaphore semaphore = new Semaphore(0);

    public static void main(String[] args) {
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //模拟耗时操作之后初始化变量num
                    Thread.sleep(1000);
                    num = 1;
                    //初始化参数后释放两个permit
                    semaphore.release(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //获取permit,如果semaphore没有可用的permit则等待,如果有则消耗一个
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"获取到的num的值为:"+num);
            }
        });
        Thread threadC = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //获取permit,如果semaphore没有可用的permit则等待,如果有则消耗一个
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"获取到的num的值为:"+num);
            }
        });
        //同时开启三个线程
        threadA.start();
        threadB.start();
        threadC.start();
    }
}

运行结果:

Thread-1获取到的num的值为:1
Thread-2获取到的num的值为:1

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++WMI获取系统硬件信息(CPU/DISK/NetWorketc)发布时间:2022-07-14
下一篇:
c++中的重名问题发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap