重新学习那里的多线程:)我试图使用两个线程来交替打印它们甚至奇数到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不应该是真的,因此两个线程完成它们的工作。
所以我的推理可能有问题:)有人可以向我解释一下吗?
答案 0 :(得分:2)
让我们进行一次线程转储:
"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
为lock.wait()
,用于顶部帖子(A
),即事件序列:
A
打印“A:50”A
通知所有A
等待lock
B
醒来并退出所以你被A
锁定了,没有什么可以唤醒它。