读书人

java多线程有关问题以下生产者和消费

发布时间: 2012-10-23 12:12:22 作者: rapoo

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)

其它也没发现什么问题。

读书人网 >J2SE开发

热点推荐