三线程打印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上锁。