执行下面代码
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方法报错导致线程强行终止,然后又是个死循环所以后面产生的线程一个个堆积。欢迎大神进行补充
看错了,上面补充你写的代码只有两个线程,一个主线程一个你自己写的,至于为什么会有那么多等待的就不知道了