A和B共享同一个锁dataSynAB不就可以了么synchronized(dataSyn)
{
synchronized(dataSynAB)
{ notify(); }
synchronized(dataSynAC) //想唤醒谁就唤醒谁,是要求这样吧?
{ notify(); }
wait();
}
{
synchronized(dataSynAB)
{ notify(); }
synchronized(dataSynAC) //想唤醒谁就唤醒谁,是要求这样吧?
{ notify(); }
wait();
}
这里写出一个类供参考,其他的仿照就可以了,呵呵。
class A extends Thread
{
public final Object dataSynA= new Object();
boolean 继续运行==true;
boolean 需要暂停A去运行B==false;
boolean 需要暂停A去运行C==false;
public void run()
{
while(继续运行==true||需要暂停A去运行B==true||需要暂停A去运行C==true)
//“继续运行“保证这个线程的继续执行
{
if(需要暂停A去运行B==true)
{
Synchronized(dataSynA)
{ wait(); }
Synchronized(dataSynB)
{ notify();}
}
else if(需要暂停A去运行C==true)
{
Synchronized(dataSynA)
{ wait(); }
Synchronized(dataSynB)
{ notify();}
}
else if(继续运行==true)
{
Synchronized(dataSynA)
{
//do some work...
wait(1000);
}
System.out.println("Continue....");
}
}
}
public void Request去运行B()
{
需要暂停A去运行B==true;
Synchronized(dataSynA)
{ notify(); }
}
public void Request去运行C()
{
需要暂停A去运行C==true;
Synchronized(dataSynA)
{ notify(); }
}
};
[1]
Synchronized(dataSynB)
{ notify();}
//这个dataSynB应该是形如b.dataSynB;b为B类的实例。
//同理如dataSynC也应该形如c.dataSynC;
[2]
可能直接看起来比较不好看,你可以考出来用editplus或是jbuilder整理一下再看,应该舒服一些。
{
public final Object dataSynA= new Object();
boolean 继续运行==true;
boolean 需要暂停A去运行B==false;
boolean 需要暂停A去运行C==false;
public void run()
{
while(继续运行==true||需要暂停A去运行B==true||需要暂停A去运行C==true)
//“继续运行“保证这个线程的继续执行
{
if(需要暂停A去运行B==true)
{
Synchronized(dataSynA)
{ wait(); }
Synchronized(b.dataSynB) //b is the instance of B class.
{ notify();}
}
else if(需要暂停A去运行C==true)
{
Synchronized(dataSynA)
{ wait(); }
Synchronized(c.dataSynC) //c is the instance of C class.
{ notify();}
}
else if(继续运行==true)
{
Synchronized(dataSynA)
{
//do some work...
wait(1000); //最好这样处理,不然A就会成为利己线程不好。
System.out.println("Continue....");
}
}
}
}
public Synchronized void Request去运行B()
{
需要暂停A去运行B==true;
Synchronized(dataSynA)
{ notify(); }
}
public Sychronized void Request去运行C()
{
需要暂停A去运行C==true;
Synchronized(dataSynA)
{ notify(); }
}
};