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

3个线程,一个打印A,一个打印B,一个打印C,利用多线程实现循环打印ABCABC....,我的代码哪错了,实在找不出来,基本打印ABC就停了。。。classPrintim... 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();
}
}
展开
 我来答
百度网友965fdef
2015-09-16
知道答主
回答量:6
采纳率:0%
帮助的人:7765
展开全部
你这程序运算出来只有三种答案: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。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
呼哈嘿吼呵Cf
2014-10-23 · TA获得超过210个赞
知道小有建树答主
回答量:335
采纳率:0%
帮助的人:205万
展开全部
如果开始进去的是A,你运行到第一个地方的时候,直接挂起了,也没唤醒其他的线程,就死锁了
更多追问追答
追问
.....
怎么可能啊
a,b,c一开始都是活动线程
而且这也不叫死锁吧。。你说的是所有线程都等待了
追答
恩恩,错了,是等待了,你这里的条件控制是不是用的有问题,condition_a,b,c和你创建的三线程压根没啥关系吧按现在这样的写法,想控制三线程还是得写三方法来的吧,你单独的一个里面这样用应该没有意义,不应该创建三个print对象,纯属个人看法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式