开发者社区> 问答> 正文

java Thread wait 问题

执行下面代码

 public class TestMain {
    public static void main(String[] args) {
        new Thread(new Runnable() {

            private Object obj = new Object();

            @Override
            public void run() {
                while(true){
                    System.out.println("rr");
                    try {
                        obj.wait(5000);
                    } catch (Exception e) {
                    }
                }
            }
        }).start();
    }
}

等待的线程会增多,请问为啥
screenshot

展开
收起
蛮大人123 2016-03-25 16:11:34 1921 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    从你的这段测试代码来看,并没有任何线程被阻塞的,Object类的wait方法的注释是这样的This method should only be called by a thread that is the owner of this object's monitor。即只有获取该对象锁的线程调用这个方法才能被阻塞,而你的代码中启动了一个线程,循环操作中并没有获取该对象锁,所以代码运行结果没有看到这个匿名线程被阻塞的情况,循环语句不停在执行。
    修正代码,当前线程获取object对象锁后再调用wait操作,可以明显看到线程被阻塞的情况。

    public class TestMain {
        public static void main(String[] args) {
            new Thread(new Runnable() {
    
                private Object obj = new Object();
    
                @Override
                public void run() {
                    while(true){
                        synchronized (obj) {
                            System.out.println("rr"+new Date());
                            try {
                                obj.wait(5000);
                            } catch (Exception e) {
                            }
                        }
                    }
                }
            }).start();
        }
    }

    明显看到线程被wait(5000)阻塞5秒后继续运行。
    而你给出的jconsole的截图中的数据不和逻辑,根本没有那么多阻塞线程的。建议不予理会,还是深入学习下java的并发知识。

    2019-07-17 19:14:37
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载