Java等待唤醒机制统计子线程运行时间的方式及其疑问

新手上路,请多包涵

我想在主线程中获取子线程运行的时间,一种方式是使用join()方法,经验证是可行的;
但是我想试试等待唤醒机制,思路是:子线程启动后主线程等待,子线程结束后唤醒主线程,但是不太清楚为什么会报错,从运行结果看出并没有提前唤醒,但是却报错了。

public class Test {
    public static void main(String[] args) {
        Object lock = new Object();
        int num = 1000;
        //子线程
        Thread t = new Thread(() -> {
            String s = "";
            for (int i = 0; i < num; i++) {
                s += "Java";
            }
            System.out.println("t Over");
            lock.notify();
        });
        //计时
        long start = System.currentTimeMillis();
        System.out.println("start = " + start);
        //启动子线程
        t.start();
        //主线程等待
        try {
            lock.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("end = " + end);
        System.out.println("end - start" + (end - start));
    }
}

刚看多线程没多久,不太明白为什么会报错?
运行结果

阅读 3k
2 个回答

Object的文档里有这样几句话:

The current thread must own this object's monitor.

IllegalMonitorStateException - if the current thread is not the owner of the object's monitor.

你这个问题的原因就是这两句话.
另外, 你可能需要考虑下如果子线程先执行notify方法, main才执行到wait方法会怎样?

使用countdownlatch或者

for (Thread thread : threads) {
  thread.join();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏