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

发布于 2022-09-11 20:26:45 字数 1074 浏览 9 评论 0

我想在主线程中获取子线程运行的时间,一种方式是使用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));
    }
}

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

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

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

发布评论

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

评论(2

深海里的那抹蓝 2022-09-18 20:26:45

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方法会怎样?

萧瑟寒风 2022-09-18 20:26:45

使用countdownlatch或者

for (Thread thread : threads) {
  thread.join();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文