三線程打印ABC
public class JavaTest implements Runnable{
private String name;
private Object prev;
private Object self;
private JavaTest(String name,Object self,Object prev){
this.name=name;
this.prev=prev;
this.self=self;
}
public static void main(String[] args) throws Exception{
Object a=new Object();
Object b=new Object();
Object c=new Object();
JavaTest pa=new JavaTest("A",a,c);
JavaTest pb=new JavaTest("B",b,a);
JavaTest pc=new JavaTest("C",c,b);
new Thread(pa).start();
Thread.sleep(100);
new Thread(pb).start();
Thread.sleep(100);
new Thread(pc).start();
Thread.sleep(100);
}
public void run() {
// TODO Auto-generated method stub
int count=10;
while(count>0){
synchronized(prev){
synchronized(self){
System.out.print(name);
count--;
self.notify();//釋放對象self
}
try {
prev.wait();//阻塞對象prev,使得該線程等待,讓其他的等待self的線程但又不需要prev的線程執行。通過控制object來控制線程
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
1.至於爲什麼prev.wait()要放在synchronized(self)之外,是由於兩個是獨立的,不能因爲沒有獲得self的鎖而導致prev不能wait()。
2.至於爲什麼要先對prev上鎖,然後對self上鎖。