执行下面代码
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();
}
}
等待的线程会增多,请问为啥
从你的这段测试代码来看,并没有任何线程被阻塞的,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的并发知识。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。