为了账号安全,请及时绑定邮箱和手机立即绑定

三线程通信与同步

三线程通信与同步

江户川乱折腾 2021-09-29 17:29:38
背景:我有三个线程。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.谁能帮我解释或修复它?感谢你!
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

以下是您发布的特定场景中发生的情况: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) {

    conC.await();

    System.out.println("I'm thread C, and I wake up " + new Date());

}

这样,如果 C 等待的条件已经满足,它就不会等待。


查看完整回答
反对 回复 2021-09-29
  • 1 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信