@Test
public void printTakeTurns() {
final int[] num = {1};
Runnable runnable = new Runnable() {
@Override
public void run() {
synchronized (this) {
while (num[0] <= 100) {
notify();
System.out.println(Thread.currentThread().getName() + ": " + num[0]);
num[0]++;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("正常结束");
}
}
};
new Thread(runnable).start();
new Thread(runnable).start();
}
以上代码执行结果如下:
Thread-0: 1
Thread-1: 2
Thread-0: 3
Thread-1: 4
Thread-0: 5
Thread-1: 6
Thread-0: 7
Thread-1: 8
Thread-0: 9
Thread-1: 10
Thread-0: 11
Thread-1: 12
Thread-0: 13
Thread-1: 14
Thread-0: 15
Thread-1: 16
Thread-0: 17
Thread-1: 18
Thread-0: 19
Thread-1: 20
Thread-0: 21
Thread-1: 22
Thread-0: 23
Thread-1: 24
Thread-0: 25
Thread-1: 26
Thread-0: 27
Thread-1: 28
Process finished with exit code 0
每次打印次数有随机性,并不能正常结束,应该是遇到 Lost Wake-Up 问题了,但这个例子是怎么导致的呢?
@fefe 说对了,这里main线程结束,程序就结束了,可以用join来保证两个子线程执行完成后才结束程序。查了相关资料,比较多人认为多线程时: