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

时间:2015-04-26 21:12:47

标签: 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不应该是真的,因此两个线程完成它们的工作。

所以我的推理可能有问题:)有人可以向我解释一下吗?

1 个答案:

答案 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)
我的代码中的

22lock.wait(),用于顶部帖子(A),即事件序列:

  • A打印“A:50”
  • A通知所有
  • A等待lock
  • B醒来并退出

所以你被A锁定了,没有什么可以唤醒它。