Java线程wait()和notify()相关问题

发布于 2022-09-11 21:13:22 字数 1340 浏览 21 评论 0

    @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 问题了,但这个例子是怎么导致的呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

故事↓在人 2022-09-18 21:13:22

@fefe 说对了,这里main线程结束,程序就结束了,可以用join来保证两个子线程执行完成后才结束程序。查了相关资料,比较多人认为多线程时:

  • 非单元测试环境中,当程序只有守护线程在运行时程序会结束,否则main线程结束不会影响其它线程的执行。
  • 单元测试环境中,main线程结束,程序就结束了。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文