使用线程同步与等待机制打印如下:
*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会报错。