猿问

三线程通信与同步

背景:我有三个线程。ThreadA 负责向队列中写入元素,如果队列已满,则通知 ThreadC 从队列中读取元素。ThreadB 是另一个条件,如果队列未满,但时间超过 5 秒,则 Thread 通知 threadC 从队列中取出元素,最后,ThreadC 通知 ThreadB 刷新其时间戳。


import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;


public class Main {

    private Lock lock = new ReentrantLock();

    private Condition conA = lock.newCondition();

    private Condition conB = lock.newCondition();

    private Condition conC = lock.newCondition();


    ArrayBlockingQueue<Integer> readQueueA = new ArrayBlockingQueue<>(3);


    public static void main(String[] args) {

        Main main1 = new Main();


        try {

            ThreadA threadWrite = main1.new ThreadA();

            Thread threadOut = new Thread(threadWrite);

            threadOut.start();


            ThreadB threadB = main1.new ThreadB();

            Thread threadBB = new Thread(threadB);

            threadBB.start();


            ThreadC threadRead = main1.new ThreadC();

            Thread threadIn = new Thread(threadRead);

            threadIn.start();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }


但是,输出不是我所期望的,为什么一开始ThreadB outPut TimeOut Zzz?我认为应该不输出这个项目。因为ThreadA唤醒了ThreadC,下一步应该exec ThreadC并且Thread可以在短时间内运行完成而不超过5s.谁能帮我解释或修复它?感谢你!


江户川乱折腾
浏览 136回答 1
1回答

侃侃无极

以下是您发布的特定场景中发生的情况:A 启动并运行 while 循环,直到它向 C 发出信号并等待。然后C启动等待,这里就出现了问题;A在C 开始等待之前发出信号,因此信号调用丢失,现在 A 和 C 都在等待。所以此时,控制台上的内容是通知 C...我是线程 C...现在 B 启动,并等待整整 5 秒,因为没有其他线程可以向它发出信号。因此,conB.await(5, TimeUnit.SECONDS)返回 false,它打印Timeout Zzzzzzz:,然后向 C 发送信号。这就是为什么事情看起来乱七八糟的原因,一个信号只有在另一个线程已经在等待时才有效!要解决此问题,请尝试更改conC.await();System.out.println("I'm thread C, and I wake up " + new Date());到if (readQueueA.size() < 3) {&nbsp; &nbsp; conC.await();&nbsp; &nbsp; System.out.println("I'm thread C, and I wake up " + new Date());}这样,如果 C 等待的条件已经满足,它就不会等待。
随时随地看视频慕课网APP

相关分类

Java
我要回答