永发信息网

Java 多线程 lock condition问题,3个线程循环打印ABCABCABC....

答案:2  悬赏:0  手机版
解决时间 2021-02-14 22:58
  • 提问者网友:疯孩纸
  • 2021-02-13 22:10
3个线程,一个打印A,一个打印B,一个打印C,利用多线程实现循环打印ABCABC....,我的代码哪错了,实在找不出来,基本打印ABC就停了。。。
class Print implements Runnable
{
private final char printChar;
private static char currentChar = 'A';
private int count = 10;
private static Lock lock = new ReentrantLock();
private final Condition condition_A = lock.newCondition();
private final Condition condition_B = lock.newCondition();
private final Condition condition_C = lock.newCondition();
Print(char printChar)
{
this.printChar = printChar;
}
public void run()
{
while(count > 0)
{

lock.lock();
try
{
if(printChar != currentChar)
{
switch(printChar)
{
case 'A':
try{condition_A.await();}catch(InterruptedException e){}
break;
case 'B':
try{condition_B.await();}catch(InterruptedException e){}
break;
case 'C':
break;
}
}
System.out.println(printChar);
switch(printChar)
{
case 'A':
currentChar = 'B';
condition_B.signal();
break;
case 'B':
currentChar = 'C';
condition_C.signal();
break;
case 'C':
currentChar = 'A';
condition_A.signal();
break;
}
}
finally
{
lock.unlock();
}
count--;
}
}
}
class Demo
{
public static void main(String []args)
{
Print a = new Print('A');
Print b = new Print('B');
Print c = new Print('C');
new Thread(a).start();
new Thread(b).start();
new Thread(c).start();
}
}
最佳答案
  • 五星知识达人网友:傲气稳了全场
  • 2021-02-13 22:52
你这程序运算出来只有三种答案:A,AB,ABC。
说下输出A的例子:
这种情况是Thread(b)和Thread(c)先执行后,都会wait等待,而Thread(a)线程后执行时,会唤醒new Thread(a).condition_B.signal();但是与Thread(b).condition_B无关。所有此时三组线程全部等待。

解决办法就是static condition_B,共享数据condition_B。
全部回答
  • 1楼网友:醉吻情书
  • 2021-02-13 23:04
如果开始进去的是A,你运行到第一个地方的时候,直接挂起了,也没唤醒其他的线程,就死锁了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯