java - 如何使用交错线程停止我的程序

标签 java multithreading thread-synchronization

在那里重新学习多线程:)我尝试使用两个线程交替打印偶数和奇数,直到 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/

相关文章:

java - 自定义类加载器可以加载类而忽略其依赖项吗?

java - 当复合组件放置在 PrimeFaces p :dialog 内时,不会调用 encodeAll 方法

java - 无法正确实现 sleep()

java - Swing:如何从 AWT 线程运行作业,但在窗口布局之后?

c - 我怎样才能按这个顺序执行3个线程呢?

java - 如何开始使用 AppScale?

java - JToolbar:JToggleButton 对齐

c - 如何在C中使用线程和互斥体?

c++ - std::thread用来阻止并等待OS/硬件线程完成的机制是什么?

java - 在 Java 中用两个线程打印数字 1-20