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

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

阅读 2k
1 个回答

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

  • 非单元测试环境中,当程序只有守护线程在运行时程序会结束,否则main线程结束不会影响其它线程的执行。
  • 单元测试环境中,main线程结束,程序就结束了。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题