class order
{
private static int i=0;
private int count=(++i);
public order()
{
if(count==10)
{System.out.println("order==10");System.exit(0);}
}
public String toString()
{
return "order:"+count;
}
}
class middle
{
private order or;
public synchronized void setOrder(order o)
{
this.or=o;
}
public synchronized order gerOrder()
{
return or;
}
}
class productor extends Thread
{
private middle mi;
public productor(middle m)
{
mi=m;
start();
}
public synchronized void run()
{
while(true)
{
while(mi.gerOrder()!=null)
{
try{System.out.println("wait consumer "+mi.gerOrder());wait();}
catch(InterruptedException e)
{
throw new RuntimeException(e);
}
}
if(mi.gerOrder()==null)
{
mi.setOrder(new order());
System.out.println("purducted");
notifyAll();
}
}
}
}
class consumer extends Thread
{
private middle mi;
public consumer(middle m)
{
mi=m;
start();
}
public synchronized void run()
{
while(true)
{
while(mi.gerOrder()==null)
{
try{System.out.println("wait productor");wait();}
catch(InterruptedException e){throw new RuntimeException(e);}
}
if(mi.gerOrder()!=null)
{
System.out.println("consumed "+mi.gerOrder());
mi.setOrder(null);
notifyAll();
}
}
}
}
public class productor_and_consumer
{
public static void main(String[] args)
{
middle mid=new middle();
productor p=new productor(mid);
consumer c=new consumer(mid);
}
}输出为:purducted
wait consumer order:1
consumed order:1
wait productor
然后就死锁了,我把run方法都同步了,还是会死锁,请各位高手帮我分析一下,为什么会死锁,万分感谢!
{
private static int i=0;
private int count=(++i);
public order()
{
if(count==10)
{System.out.println("order==10");System.exit(0);}
}
public String toString()
{
return "order:"+count;
}
}
class middle
{
private order or;
public synchronized void setOrder(order o)
{
this.or=o;
}
public synchronized order gerOrder()
{
return or;
}
}
class productor extends Thread
{
private middle mi;
public productor(middle m)
{
mi=m;
start();
}
public synchronized void run()
{
while(true)
{
while(mi.gerOrder()!=null)
{
try{System.out.println("wait consumer "+mi.gerOrder());wait();}
catch(InterruptedException e)
{
throw new RuntimeException(e);
}
}
if(mi.gerOrder()==null)
{
mi.setOrder(new order());
System.out.println("purducted");
notifyAll();
}
}
}
}
class consumer extends Thread
{
private middle mi;
public consumer(middle m)
{
mi=m;
start();
}
public synchronized void run()
{
while(true)
{
while(mi.gerOrder()==null)
{
try{System.out.println("wait productor");wait();}
catch(InterruptedException e){throw new RuntimeException(e);}
}
if(mi.gerOrder()!=null)
{
System.out.println("consumed "+mi.gerOrder());
mi.setOrder(null);
notifyAll();
}
}
}
}
public class productor_and_consumer
{
public static void main(String[] args)
{
middle mid=new middle();
productor p=new productor(mid);
consumer c=new consumer(mid);
}
}输出为:purducted
wait consumer order:1
consumed order:1
wait productor
然后就死锁了,我把run方法都同步了,还是会死锁,请各位高手帮我分析一下,为什么会死锁,万分感谢!
consumer c=new consumer(mid);
这样声明的是两个线程类的实例,每个线程实例都拥有自己的run方法,所以你将run方法同步和同步没多大关系,你现在是在两个线程中共享一个资源也即是mid这个对象,所以你应该对这个mid对象同步,使两个线程轮流获得这个对象的锁!用完后释放这个锁,防止出现死锁!
而不是同步run方法!
内存同时进行的写操作。
mi.setOrder(null);
notifyAll();
这段代码,(注意:这时productor的wait()方法还没被执行到),随后刚才被中断的productor占有CPU,执行wait(),而此时mi.gerOrder()==null,所以consumer也会等待,这样引起死锁.我现在想的是当执行到关键段时,如productor的
while(mi.gerOrder()!=null)
{
try{System.out.println("wait consumer "+mi.gerOrder());wait();}
catch(InterruptedException e)
{
throw new RuntimeException(e);
}
}
时不能被中断或即使可以被中断,consumer也不能被执行.请问各位高手有什么方法?
万分感谢!
sleep(1000)象这样让时间过后自动回复!
变量设置好了就进入等待状态,知道变量可以用为止举个例子
class SuspendRequestor
{
private boolean suspendRequested;
public synchronized void set (boolean b)
{
suspendRequested = b;
notifyAll();
}
public synchronized void waitForResume( )
throws InterruptedException
{
while(suspendRequested) wait();
}
} 应用程序:
class MyThread extends Thread
{
public void requestSuspend( )
{
suspender.set(true);
}
public void requestResume( )
{
suspender.set(false);
}
public void run( )
{
try
{
while (.....)
{
suspender.waitForResume();
......
}