java 的开很多线程中 使用wait把每个线程都挂住 但使用notify能确保每个线程都正常resume吗
实际我试验的结果 貌似是不能完全恢复啊
举个简单的例子
public class TestThread extends Thread{
public void run(){ //假设run部分分三步,每一部分都是复杂的操作,而且每次每次做完后 都需要挂住 等待
callStep1()
WaitSyn()
callStep2()
WaitSyn()
callStep3()
} public synchronized void WaitSyn(){
try {
wait(); //这样把每个线程都挂住
}catch(InterruptedException e)
{
e.printStackTrace();
}
} public void Resume(){
synchronized(this){
notify(); //书上说 notify会随机的恢复一个挂起的线程
}
}}
public static void main(String args[]){
int NUM=30; //假设线程开很多 这里就开30个
TestThread []loaders=new TestThread[NUM];
for(int i=0;i<NUM;i++)
{
loaders[i]=new TestThread(i+"");
loaders[i].start(); //直接运行 运行完step1后会挂住
}
try{
Thread.currentThread().sleep(10000); //这部分就是等待一段时间 再全部恢复线程 再10秒内 step1已完成
}catch(Exception e){
e.printStackTrace();
}
for(int i=0;i<NUM;i++)
{
loaders[i].Resume(); //将挂住的30个线程都恢复???? 但问题是貌似30个线程不能完全恢复啊 只能恢复十几个 或二十几个 每次都不会完整的恢复30个线程继续执行step2 }
}这个问题很奇怪 notify是随机恢复的 难道我掉30次notify 还不能全部恢复吗??
谢谢各位
实际我试验的结果 貌似是不能完全恢复啊
举个简单的例子
public class TestThread extends Thread{
public void run(){ //假设run部分分三步,每一部分都是复杂的操作,而且每次每次做完后 都需要挂住 等待
callStep1()
WaitSyn()
callStep2()
WaitSyn()
callStep3()
} public synchronized void WaitSyn(){
try {
wait(); //这样把每个线程都挂住
}catch(InterruptedException e)
{
e.printStackTrace();
}
} public void Resume(){
synchronized(this){
notify(); //书上说 notify会随机的恢复一个挂起的线程
}
}}
public static void main(String args[]){
int NUM=30; //假设线程开很多 这里就开30个
TestThread []loaders=new TestThread[NUM];
for(int i=0;i<NUM;i++)
{
loaders[i]=new TestThread(i+"");
loaders[i].start(); //直接运行 运行完step1后会挂住
}
try{
Thread.currentThread().sleep(10000); //这部分就是等待一段时间 再全部恢复线程 再10秒内 step1已完成
}catch(Exception e){
e.printStackTrace();
}
for(int i=0;i<NUM;i++)
{
loaders[i].Resume(); //将挂住的30个线程都恢复???? 但问题是貌似30个线程不能完全恢复啊 只能恢复十几个 或二十几个 每次都不会完整的恢复30个线程继续执行step2 }
}这个问题很奇怪 notify是随机恢复的 难道我掉30次notify 还不能全部恢复吗??
谢谢各位
但是有个概念你好像搞错了。
”这个问题很奇怪 notify是随机恢复的 难道我掉30次notify 还不能全部恢复吗??“30个都恢复,并不是因为你notify了30次,并且每次随机唤醒一个。
实际上,每次你调用一次loaders[i].Resume(),就是唤醒固定的loaders[i]这个线程。 因为每个线程都是以自己这个对象做锁,就是说30个线程就有30把锁。
附一句:wait();是Object的方法,不要勿以为是Thread的方法了。
并不是所有线程都被唤醒 继续执行step2啊
System.out.printlt("Thread " + this.getName() +" resumed.");