美文网首页练习题
三个线程abc并发允许,bc需要a线程的数据怎么实现。

三个线程abc并发允许,bc需要a线程的数据怎么实现。

作者: 老奶猹 | 来源:发表于2020-07-11 10:54 被阅读0次

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

public class ThreadCommunication  {
    private static int num;
        /**
     * 定义一个信号量,该类内部维持了多个线程锁,可以阻塞多个线程,释放多个线程, 
. 线程的阻塞和释放是通过 permit 概念来实现的 
   * 线程通过 semaphore.acquire()方法获取 permit,如果当前 semaphore 有 permit 则分配给该线程,
 如果没有则阻塞该线程直到 semaphore 
  * 调用 release()方法释放 permit。 
   * 构造函数中参数:permit(允许) 个数
    */
    //声明一个semaphore对象
    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;
                    //释放2个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);

               }
        });
        //同时开启3个线程
        threadA.start();
        threadB.start();
        threadC.start();
    }
}

相关文章

  • 三个线程abc并发允许,bc需要a线程的数据怎么实现。

    根据问题的描述,我将问题用以下代码演示,ThreadA、ThreadB、ThreadC,ThreadA 用于初始化...

  • 线程同步经典问题之读者-作者问题

    问题描述:假设一个数据库为多个并发线程所共享。有的线程只读,有的线程需要写数据库。因此要求:①允许多个读者可以同时...

  • Java 线程 - 线程顺序执行

    1 三个线程顺序打出abc 2 三个线程顺序打出abc 30次[Semaphore] 3 三个线程顺序打出abc ...

  • RAC 与 多线程

    07 - RAC与多线程 RAC怎么实现多线程并发处理订阅? RAC多线程模式怎么解决资源抢夺? RAC怎么实现取...

  • 利用spring实现多线程 + 事务回滚

    前言 利用线程池和CountDownLatch,多线程并发处理批量数据,实现多线程事务回滚,事务补偿。 begin...

  • 环形队列RingBuffer--Java实现

    在多线程并发中,程序为了保证线程的安全,通常需要加锁。那有没有一种数据结构能够实现不加锁的线程安全呢?有,就是大名...

  • Java 多线程(四):ThreadLocal 详解

    ThreadLocal 多线程在并发执行时,需要数据共享,因此才有了 volatile 变量解决多线程数据之间可见...

  • java 多线程1

    线程为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), ...

  • Java基础(六)

    多线程 Java多线程并发 1.1 JAVA 并发知识库 1.2 JAVA 线程实现/创建方式 1.2.1 继承 ...

  • ABC

    ABC 有A、B、C 三个线程,A线程 输出“A”,B线程 输出“B”,C线程 输出“C”,要求同时启动3个线程,...

网友评论

    本文标题:三个线程abc并发允许,bc需要a线程的数据怎么实现。

    本文链接:https://www.haomeiwen.com/subject/kzwbcktx.html