题目是这样的
有三个线程,循环输出,需要按照顺序打印10次,比如线程1,线程2,线程3分别打印0,1,2
最后的输出结果就是012012......一共10次
public class LockThreadTest extends Thread{
private int x ;
static class MyClass {
private static int x = 0;
}
public LockThreadTest(int x){
this.x = x;
}
@Override
public void run() {
int i = 10;
//循环控制notifyall后线程不会结束
while (i-- > 0){
//必须要一个全局对象来锁,三个线程使用同一把锁
synchronized (MyClass.class){
//如果不该本线程打印就wait等待并释放锁
while (MyClass.x %3 != x){
try {
MyClass.class.wait();
}catch (Exception e){
}
}
System.out.print(x);
MyClass.x++;
MyClass.class.notifyAll();
}
}
}
public static void main(String[] args) {
Thread lockThreadTest = new LockThreadTest(0);
Thread lockThreadTest1 = new LockThreadTest(1);
Thread lockThreadTest2 = new LockThreadTest(2);
lockThreadTest.start();
lockThreadTest1.start();
lockThreadTest2.start();
}
}
最后的输出结果是
解题过程:
1.notifyall()不会直接去唤醒等待的线程而是要等待该监视器锁被释放后才会让被唤醒的线程继续执行