使用线程同步与等待机制打印如下:
*Thread-0#Thread-1@Thread-2
* Thread-0#Thread-1@Thread-2
*Thread-0#Thread-1@Thread-2
* Thread-0#Thread-1@Thread-2
*Thread-0#Thread-1@Thread-2
*Thread-0#Thread-1@Thread-2
代码如下:
class Flag{ private boolean thread0; private boolean thread1; private boolean thread2; public Flag(boolean thread0, boolean thread1, boolean thread2) { super(); this.thread0 = thread0; this.thread1 = thread1; this.thread2 = thread2; } public boolean isThread0() { return thread0; } public void setThread0(boolean thread0) { this.thread0 = thread0; } public boolean isThread1() { return thread1; } public void setThread1(boolean thread1) { this.thread1 = thread1; } public boolean isThread2() { return thread2; } public void setThread2(boolean thread2) { this.thread2 = thread2; } } class MyThread implements Runnable { private Flag flag; public MyThread(Flag flag) { this.flag = flag; } @Override public void run() { synchronized (flag) { for (int i = 0; i < 1000; i++) { String threadName = Thread.currentThread().getName(); if(flag.isThread0() && threadName.equals("thread0")) { System.out.println("&" + Thread.currentThread().getName()); flag.setThread0(false); flag.setThread1(true); flag.setThread2(false); flag.notifyAll(); } else if (flag.isThread1() && threadName.equals("thread1")) { System.out.println("*" + Thread.currentThread().getName()); flag.setThread0(false); flag.setThread1(false); flag.setThread2(true); flag.notifyAll(); } else if (flag.isThread2() && threadName.equals("thread2")) { System.out.println("#" + Thread.currentThread().getName()); flag.setThread0(true); flag.setThread1(false); flag.setThread2(false); flag.notifyAll(); } else { try { flag.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } public class Test { public static void main(String[] args) { Flag flag = new Flag(true, false, false); Thread t0 = new Thread(new MyThread(flag)); Thread t1 = new Thread(new MyThread(flag)); Thread t2 = new Thread(new MyThread(flag)); t0.setName("thread0"); t1.setName("thread1"); t2.setName("thread2"); t2.start(); t1.start(); t0.start(); }
运行结果如下:
总结:当对象未持有锁但是使用了wait或者notify会报错。