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();
}
} 展开
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();
}
} 展开
2个回答
展开全部
你这程序运算出来只有三种答案: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。
说下输出A的例子:
这种情况是Thread(b)和Thread(c)先执行后,都会wait等待,而Thread(a)线程后执行时,会唤醒new Thread(a).condition_B.signal();但是与Thread(b).condition_B无关。所有此时三组线程全部等待。
解决办法就是static condition_B,共享数据condition_B。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果开始进去的是A,你运行到第一个地方的时候,直接挂起了,也没唤醒其他的线程,就死锁了
更多追问追答
追问
.....
怎么可能啊
a,b,c一开始都是活动线程
而且这也不叫死锁吧。。你说的是所有线程都等待了
追答
恩恩,错了,是等待了,你这里的条件控制是不是用的有问题,condition_a,b,c和你创建的三线程压根没啥关系吧按现在这样的写法,想控制三线程还是得写三方法来的吧,你单独的一个里面这样用应该没有意义,不应该创建三个print对象,纯属个人看法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询