例题描述:建立三个线程,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();
}
}