62,614
社区成员
发帖
与我相关
我的任务
分享
上面这段代码在执行后会出现无法生产无法消费的挂起现象。。求大佬解答一下哪里错了
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Lock_and_Condition
{
public static void main(String[] args)
{
Resouce re = new Resouce();
Lock lock = new ReentrantLock();
ShengChanZhe i = new ShengChanZhe(re, (ReentrantLock)lock);
XiaoFeiZhe o = new XiaoFeiZhe(re ,(ReentrantLock)lock);
Thread t1 = new Thread(i, "生产者1");
Thread t2 = new Thread(i, "生产者2");
Thread t3 = new Thread(i, "生产者3");
Thread t4 = new Thread(o, "消费者1");
Thread t5 = new Thread(o, "消费者2");
Thread t6 = new Thread(o, "消费者3");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
}
class Resouce
{
private String name;
private int count = 1;
private boolean flag;
public void setName(String name) {
this.name = name;
}
public void setCount(int count) {
this.count = count;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getName() {
return name;
}
public int getCount() {
return count;
}
public boolean getFlag()
{
return flag;
}
}
class XiaoFeiZhe implements Runnable
{
private Resouce res;
private Lock lock;
private Condition con;
XiaoFeiZhe(Resouce re, ReentrantLock lock)
{
this.res = re;
this.lock = lock;
con = this.lock.newCondition();
}
public void run()
{
while(true)
{
lock.lock(); //上锁,同步
//为了执行finally语句的内容,使用try
try
{
if(res.getFlag())
{
System.out.println(Thread.currentThread().getName()+"-----买走了第"+res.getCount()+"个"+res.getName());
res.setCount(res.getCount()+1);
res.setFlag(false);
con.signalAll(); //唤醒所有等待线程,赋予执行资格
lock.unlock();
}
else
{
try {
lock.unlock();
con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}catch(Exception e) {
}
}
}
}
class ShengChanZhe implements Runnable
{
private Resouce re;
private Lock lock;
private Condition con;
ShengChanZhe(Resouce re, ReentrantLock lock)
{
this.re = re;
this.lock = lock;
con = this.lock.newCondition();
}
public void run()
{
while(true)
{
lock.lock();
try
{
if(re.getFlag())
{
try {
lock.unlock();
con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else
{
re.setName("混沌原核");
System.out.println(Thread.currentThread().getName()+"生产了第"+re.getCount()+"个"+re.getName());
re.setFlag(true);
con.signalAll();
//唤醒所有等待线程,赋予执行资格
lock.unlock();
}
}catch(Exception e){
}
}
}
}
上面这段代码在执行后会出现无法生产无法消费的挂起现象。。求大佬解答一下哪里错了
[quote=引用 6 楼 antigenMHC 的回复:] 感谢大佬,那我这样理解可以吗:await是放弃了执行资格,unlock是让出了执行权(锁),如果await先执行的话就会出现没有执行资格,但却一直占用执行权(锁),从而导致其它线程无法执行的情况?
感谢大佬,那我这样理解可以吗:await是放弃了执行资格,unlock是让出了执行权(锁),如果await先执行的话就会出现没有执行资格,但却一直占用执行权(锁),从而导致其它线程无法执行的情况?
感觉是因为生产者了消费者new了不同的condition
[quote=引用 楼主 antigenMHC 的回复:] 上面这段代码在执行后会出现无法生产无法消费的挂起现象。。求大佬解答一下哪里错了
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Lock_and_Condition
{
public static void main(String[] args)
{
Resouce re = new Resouce();
Lock lock = new ReentrantLock();
ShengChanZhe i = new ShengChanZhe(re, (ReentrantLock)lock);
XiaoFeiZhe o = new XiaoFeiZhe(re ,(ReentrantLock)lock);
Thread t1 = new Thread(i, "生产者1");
Thread t2 = new Thread(i, "生产者2");
Thread t3 = new Thread(i, "生产者3");
Thread t4 = new Thread(o, "消费者1");
Thread t5 = new Thread(o, "消费者2");
Thread t6 = new Thread(o, "消费者3");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
}
class Resouce
{
private String name;
private int count = 1;
private boolean flag;
public void setName(String name) {
this.name = name;
}
public void setCount(int count) {
this.count = count;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getName() {
return name;
}
public int getCount() {
return count;
}
public boolean getFlag()
{
return flag;
}
}
class XiaoFeiZhe implements Runnable
{
private Resouce res;
private Lock lock;
private Condition con;
XiaoFeiZhe(Resouce re, ReentrantLock lock)
{
this.res = re;
this.lock = lock;
con = this.lock.newCondition();
}
public void run()
{
while(true)
{
lock.lock(); //上锁,同步
//为了执行finally语句的内容,使用try
try
{
if(res.getFlag())
{
System.out.println(Thread.currentThread().getName()+"-----买走了第"+res.getCount()+"个"+res.getName());
res.setCount(res.getCount()+1);
res.setFlag(false);
con.signalAll(); //唤醒所有等待线程,赋予执行资格
lock.unlock();
}
else
{
try {
lock.unlock();
con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}catch(Exception e) {
}
}
}
}
class ShengChanZhe implements Runnable
{
private Resouce re;
private Lock lock;
private Condition con;
ShengChanZhe(Resouce re, ReentrantLock lock)
{
this.re = re;
this.lock = lock;
con = this.lock.newCondition();
}
public void run()
{
while(true)
{
lock.lock();
try
{
if(re.getFlag())
{
try {
lock.unlock();
con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else
{
re.setName("混沌原核");
System.out.println(Thread.currentThread().getName()+"生产了第"+re.getCount()+"个"+re.getName());
re.setFlag(true);
con.signalAll();
//唤醒所有等待线程,赋予执行资格
lock.unlock();
}
}catch(Exception e){
}
}
}
}
[/quote]感谢大佬,那我这样理解可以吗:await是放弃了执行资格,unlock是让出了执行权(锁),如果await先执行的话就会出现没有执行资格,但却一直占用执行权(锁),从而导致其它线程无法执行的情况?