例題描述:建立三個線程,A線程打印100次A,B線程打印100次B,C線程打印100次C,要求線程同時運行,交替打印100次ABC。這個問題用Object的wait(),notify()就可以很方便的解決。
public class HelloJava{
static class OrderedThread implements Runnable{
private Object next;
private Object current;
private String printStr;
OrderedThread(Object current, Object next, String str){
this.printStr = str;
this.next = next;
this.current = current;
}
@Override
public void run() {
for (int i=0;i<100;i++){
// 總體思路:1.在一輪完成之前,阻塞自己進入下一輪循環;2.在當前打印完成之前,先獲取下一個打印線程的鎖
synchronized (current){
// 當前線程先持有下一個打印線程需要的鎖,先阻塞下一個線程工作
synchronized (next){
if (Thread.currentThread().getName().equals("AAA--")) System.out.println();
System.out.println(Thread.currentThread().getName() + ": " + printStr);
// 在當前線程打印完之後,才釋放下一個線程的鎖,以保證次序
// 假設是A-D四個線程循環,當D打印完成後,通知A進而第二輪循環
// A線程在第二輪打印完成後,觸發第一輪的B線程執行wait()後面的操作,也就是B也開始進入第二輪
next.notify();
}
// 執行到此處,就釋放了next的鎖,next是下一個線程需要的鎖,即此時觸發下一個線程工作
try {
// 當前線程打印完,就先阻塞起來,等待一輪打印完成後,才進而二輪循環
// 第一輪裏面,A線程一直阻塞,直到最後被D線程notify,因爲D的next是A的current wait的鎖
current.wait();
System.out.println(Thread.currentThread().getName() + " end.........");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
synchronized (next){
next.notify();
System.out.println(Thread.currentThread().getName()+"執行完畢" + next);
}
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(new OrderedThread("A", "B", "aaa"), "AAA--").start();
Thread.sleep(100);
new Thread(new OrderedThread("B", "C", "bbb"), "BBB--").start();
Thread.sleep(100);
new Thread(new OrderedThread("C", "D", "ccc"), "CCC--").start();
Thread.sleep(100);
new Thread(new OrderedThread("D", "A", "ddd"), "DDD--").start();
}
}