java 中关于线程同步的问题
class All implements Runnable
{ int i=0;
String name;
public void run()
{ while(true)
{ i++;
/* if(i==11)
{ try{wait();}
catch(Exception e){}
}*/
System.out.println(name+"i="+i);
if(i==5)
{ try {挂起线程();}
catch(Exception e){}
}
try{Thread.sleep(1000);}
catch(Exception e){}
}
}
public synchronized void 挂起线程()throws InterruptedException
{ wait();
}
public synchronized void 恢复线程()
{ notifyAll();
}
}
public class WaitExa
{
public static void main(String[] args)
{ int m=0;
All target=new All();
target.name="张三";
Thread thread=new Thread(target);
thread.start();
while(true)
{
m++;
System.out.println("我是主线程m="+m);
if(m==10)
{ System.out.println("让"+thread.getName()+"继续工作");
try{target.恢复线程();}
catch(Exception e){}
break;
}
try{Thread.sleep(1000);}
catch(Exception e){}
}
}
}
上面的线程是是实现 thread 每隔一秒输出一整数,输到5后,该线程挂起。主线程每隔一秒输出一个整数,输出20个后,让thread调用notifyAll()方法。始线程继续执行。public synchronized void 挂起线程()throws InterruptedException
中的关键字synchronized 去掉后,为什么wait()不起作用?还有/* if(i==11) { try{wait()};catch(Exception){} }*/
我把注释去掉,这段代码也没起作用,怎样使 thread输到11时再次挂起??
------解决方案--------------------
wait()方法必须在同步方法或块里起作用.
不在同步方法或块里不起作用.
象你的程序,把注释去掉,你希望wait()执行后进入等待,可你的这段程序不是同步的,没有同步对象锁,所以线程调度无法把它放入阻塞池里,程序将继续执行.
如果你想让这段程序起作用,还得用"挂起线程()".
而你想这时挂起, 但这时因为主线程已经退出了, thread 线程就一直等了,没有人唤醒了.