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();
    }
}

等待的线程会增多,请问为啥图片说明

你这样做,那么每个Thread创建好之后都要等5秒了,就是你执行一次程序,就创建一个线程,同时会等5秒,

因为对象都是每次新创建,他们彼此之间没什么关系

我看不出来你想要测什么问题

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

 import java.util.Date;

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的并发知识。

谢谢大家回答,我再描叙一下,上面的代码是我抽出简单的demo,像 毕小宝 说的一样,其实这个 wait 没有用,会抛异常,但是段代码运行久了,会导致系统崩掉,产生大量日志,系统硬盘不够,导致系统拒绝服务

我向问得是,这段代码,为什么会导致等待的线程不断增多

首先wait方法只能在同步代码块中写也就是说有synchronized 关键字的情况下才能用,wait方法是使当前线程放弃锁,使之进入阻塞状态,让其他同样用到这把锁的线程执行。
所以你这里wait方法报错导致线程强行终止,然后又是个死循环所以后面产生的线程一个个堆积。欢迎大神进行补充

看错了,上面补充你写的代码只有两个线程,一个主线程一个你自己写的,至于为什么会有那么多等待的就不知道了