在那里重新学习多线程:)我尝试使用两个线程交替打印偶数和奇数,直到 50。
public class Threading {
private static final Object lock = new Object();
private static int i = 0;
public static void main(String[] args) {
new Thread(() -> {
while(i <= 50) {
synchronized (lock) {
System.out.println("A :" + i++);
try {
lock.notify();
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(() -> {
while(i < 50) {
synchronized (lock) {
System.out.println("B :" + i++);
try {
lock.notify();
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
效果很好,输出:
A :0
B :1
...
A :48
B :49
A :50
但是程序并没有停止,我不知道为什么。
我的理解是,当 A 打印 50 时,它释放 B 的锁,那么 B 的条件不成立,它释放锁,那么 A 的条件不成立,因此两个线程完成其工作。
所以我的推理可能有问题:)有人可以向我解释一下吗?
最佳答案
让我们进行线程转储:
"Thread-0@617" prio=5 tid=0xe nid=NA waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.lang.Object.wait(Object.java:502)
at com.boris.testbench.App.lambda$main$0(App.java:22)
at com.boris.testbench.App$$Lambda$1.1330278544.run(Unknown Source:-1)
at java.lang.Thread.run(Thread.java:745)
我的代码中的第 22
行是顶级线程 (A
) 的 lock.wait()
,事件顺序:
A
打印“A:50”A
通知所有人A
等待锁定
B
唤醒并退出
因此,A
已被锁定,无法唤醒它。
关于java - 如何使用交错线程停止我的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29883607/