“之间的区别”;“封锁”;及;定时“等待”;关于java

“之间的区别”;“封锁”;及;定时“等待”;关于java,java,multithreading,Java,Multithreading,我们的雄猫没有回应任何请求。当我使用“jstack pid”打印堆栈信息时,我得到了以下信息。我发现它被“Thread.sleep(long)”阻塞了。我认为应该是“定时等待”。为什么? 我的代码: private void checkMaster(HibernateTemplate hdao) { int loopErrors = errorTimes; int loopSuccess = successTimes; while(true) { bool

我们的雄猫没有回应任何请求。当我使用“jstack pid”打印堆栈信息时,我得到了以下信息。我发现它被“Thread.sleep(long)”阻塞了。我认为应该是“定时等待”。为什么?

我的代码:

private void checkMaster(HibernateTemplate hdao) {
    int loopErrors = errorTimes;
    int loopSuccess = successTimes;
    while(true) {
        boolean success = true;
        try {
            if(hdao == null){
                success = false;
                continue;
            }
            success = checkMasterStatusOnce(hdao);//try access database to get the status
        } catch (Exception e1) {
            logger.error("",e1);
            success = false;
        }

    try {
        Thread.sleep(checkInterval);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}
在中调用该方法

public void check() {
    for (final JdbcTemplate jdao : jdbcTemplates) {
        threadPoolExecutor.execute(new Runnable(){
            public void run() {
                checkMaster(jdao);
            }
        });
    }
}

你说得对,方法
线程中
线程的线程状态应该是
TIMED\u WAITING

引用:

公共静态最终线程。状态超时\u等待

具有指定等待时间的等待线程的线程状态。由于使用指定的正等待时间调用以下方法之一,线程处于定时等待状态:

  • Thread.sleep
  • 对象。等待
    超时
  • Thread.join
    超时
  • LockSupport.parknos
  • LockSupport.parking直到
我测试了
1.6
1.8
范围内的几个Java版本(Oracle的实现),所有这些版本都显示了
线程内报告线程的正确行为。睡眠状态为
定时等待

同样重要的是考虑:

…线程不会失去任何监视器的所有权

因此,由于线程不会失去监视器的所有权,因此它不会重新获取监视器。所以它不应该在里面

因此,要么您使用的是不同的JVM/JRE实现,要么是经过修改的
Thread
类,可能是在运行时通过插装进行了修改。无论哪种情况,你在问题中提供的信息都不足以进一步缩小你的问题范围


知道您使用了哪个版本的
jstack
作为输出的格式与我得到的格式不同也会很有用。可能是打印错误状态的工具…

是否想使用本网站提供的格式化工具缩进代码、标记代码等?您可以随心所欲地思考,但Java设计师不同意您的意见。毫无疑问,当他们在20年前设计这个时,他们并没有从你的观点中获益。你的实际问题是什么?@EJP:实际上他说得对,
thread.sleep
.java-version java版本“1.7.0_51”java(TM)SE运行时环境(build 1.7.0_51-b13)java热点(TM)64位服务器虚拟机(build 24.51-b03,混合模式)我没有找到任何“锁”.我测试了这个版本,结果也一样。但是,如上所述,您没有使用jdk中的标准
jstack
工具。输出看起来不同。说出你曾经得到的输出。或者尝试使用标准的
jstack
命令进行比较。
public void check() {
    for (final JdbcTemplate jdao : jdbcTemplates) {
        threadPoolExecutor.execute(new Runnable(){
            public void run() {
                checkMaster(jdao);
            }
        });
    }
}