背景:我有三个线程。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 等待的条件已经满足,它就不会等待。
添加回答
举报
0/150
提交
取消