日期:2014-05-20  浏览次数:20642 次

java多线程问题,以上生产者和消费者java程序为什么会出现死锁,如何修改,请大神赐教
class Producer implements Runnable
{
private Q q;
public Producer(Q q)
{
this.q=q;
}
public void run()
{
int i=0;
while(true)
{
if(i==0)
q.put("张三","男");
else q.put("李四","女");
i=(i+1)%2;
// synchronized(q)
// { if (q.bFull=true)
//
// try{q.wait();} catch(Exception e) { e.printStackTrace();}
//
// if(i==0)
// {
// q.name="杨双";
// try{Thread.sleep(1);}
// catch(Exception e){}
// q.sex="男";
// }
// else
// {
// q.name="杨玉洁" +
// "";
// try{Thread.sleep(1);}
// catch(Exception e){}
// q.sex="女";
// }
// q.bFull=true;
// q.notify();
// i=(i+1)%2;
// }
}
}
}

class Consumer implements Runnable
{
private Q q;
public Consumer(Q q)
{
this.q=q;//this关键字标识当前的实例对象
}
public void run()
{

while(true)
{
// synchronized (q)
// {
// if(!q.bFull)//bfull为假,Consumer线程发布对q的所有权,让出监视器,等待其他线程用notify
//// 方法通知它醒来
// try{q.wait();} catch(Exception e){e.printStackTrace();}
// System.out.println(q.name);
// System.out.println(q.sex);
// q.bFull=false;
// q.notifyAll();//唤醒在q上等待的线程
// }//退出同步块,让出监视器
q.get();
}
}
}

 class Q{
private String name="unknown";
private String sex="unknown";
private boolean bFull=false;
public synchronized void put(String name,String sex)
{
if(bFull=true)
try{wait();}catch(Exception e){e.printStackTrace();}
this.name=name;
try{Thread.sleep(10);} catch(Exception e){ e.printStackTrace();}
this.sex=sex;
bFull=true;
notifyAll();
}

public synchronized void get()
{
if(!bFull)
try{wait();}catch(Exception e){e.printStackTrace();}
System.out.print(name);
// try{
// Thread.sleep(1);
// }
// catch(Exception e)
// {
// e.printStackTrace();
// }
System.out.println("的性别是"+sex);
bFull=false;
notify();
}
}
class ThreadCommunication{

public static void main(String []args)
{
Q q=new Q();
new Thread(new Producer(q)).start();
new Thread(new Consumer(q)).start();

}
}

------解决方案--------------------
if(bFull=true)
改成:
if(bFull == true) 或者 if(bFull)

其它也没发现什么问题。

------解决方案--------------------
探讨
if(bFull=true)
改成:
if(bFull == true) 或者 if(bFull)

其它也没发现什么问题。