这是在接受采访时向我的一位朋友提出的问题。
如何知道某个线程是否在同步方法中被阻止,来自另一个线程?
有人可以用一个例子解释一下吗?
答案 0 :(得分:20)
使用Thread.getState()
:
Thread.State state = getThreadInQuestion().getState();
if(state == Thread.State.BLOCKED) {
System.out.println("Blocked");
} else {
System.out.println("Not blocked");
}
在VM之外,您可以使用jstack
工具获取每个线程的完整线程信息,或连接到JMX并探索Thread MBean。
答案 1 :(得分:2)
我的简短回答是“不,不可靠”。
有人提到检查getState() == Thread.State.BLOCKED
。 然而,当你得到答案时它可能已经过时如果被阻止的线程在第三个线程锁定的监视器上等待,并且监视器就像getState
那样被释放了回来。
答案 2 :(得分:0)
我不知道你是否能够知道这一点。但你可以Thread.currentThread()
来告诉你正在执行该方法的线程。
答案 3 :(得分:0)
线程t1 =新线程(); Thread.State state = t1.getState();