晨枫112358 2016-08-22 06:41 采纳率: 0%
浏览 833

java多线程初级死锁问题

import java.util.concurrent.locks.*;
class Resource
{
private String name;
private int count=1;
private boolean flag=false;
//创建一个锁对象
Lock lock=new ReentrantLock();
Condition producer_con=lock.newCondition();
Condition consumer_con=lock.newCondition();
public void set(String name)
{ lock.lock();
try{

while(flag)
{try
{producer_con.await();}
catch(InterruptedException e){}
}
this.name=name+count;
count++;
System.out.println(Thread.currentThread().getName()+"。。。生产者。。。"+this.name);
flag=true;
consumer_con.signal();
}
finally{lock.unlock();}
}
public void show()
{ lock.lock();
try{

while(!flag)
try
{consumer_con.await();}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"。。。消费者。。。"+this.name);
flag=false;
producer_con.signal();
}
finally{lock.unlock();}
}
}
class Producer implements Runnable
{private Resource r;
public Producer(Resource r)
{
this.r=r;
// TODO Auto-generated constructor stub
}
public void run()
{
r.set("烤鸭");
}
}
class Consumer implements Runnable
{private Resource r;
Consumer(Resource r)
{
this.r=r;
// TODO Auto-generated constructor stub
}
public void run()
{
r.show();
}
}
public class ProducerCustomer {
public static void main(String[]args)
{
Resource r=new Resource();
Producer p1=new Producer(r);
Producer p2=new Producer(r);
Consumer c1=new Consumer(r);
Consumer c2=new Consumer(r);
Thread t1=new Thread(p1);
Thread t2=new Thread(p2);
Thread t3=new Thread(c1);
Thread t4=new Thread(c2);
t1.start();
t2.start();
t3.start();
t4.start();

}
}

打印结果:
Thread-0。。。生产者。。。烤鸭1
Thread-2。。。消费者。。。烤鸭1
Thread-1。。。生产者。。。烤鸭2
Thread-3。。。消费者。。。烤鸭2

然后就没了。。。。请问是死锁了吗?怎么解决

  • 写回答

2条回答 默认 最新

  • 小黄人的banana 2016-08-25 02:30
    关注

    signAll()试试

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?