如何在java中检查方法状态?
假设我有一个名为myMethod()的实例方法。我需要检查是否有线程正在执行该方法。有没有一种方法可以使用反射或其他API来检查这一点 我想在方法未执行时执行一些清理逻辑。因此需要检查该方法是否正在运行。没有办法完全按照您所说的去做(直接检查其他线程是否在方法内部) 然而,这听起来像是一个典型的例子。使方法调用在某个对象的监视器上同步;让你的清理代码在同一个监视器上同步,瞧!现在,如果任何线程正在运行已同步的方法,则清理代码将无法运行,但将等待所有线程退出这些方法,然后继续 下面是一个例子:如何在java中检查方法状态?,java,reflection,Java,Reflection,假设我有一个名为myMethod()的实例方法。我需要检查是否有线程正在执行该方法。有没有一种方法可以使用反射或其他API来检查这一点 我想在方法未执行时执行一些清理逻辑。因此需要检查该方法是否正在运行。没有办法完全按照您所说的去做(直接检查其他线程是否在方法内部) 然而,这听起来像是一个典型的例子。使方法调用在某个对象的监视器上同步;让你的清理代码在同一个监视器上同步,瞧!现在,如果任何线程正在运行已同步的方法,则清理代码将无法运行,但将等待所有线程退出这些方法,然后继续 下面是一个例子: p
public class Foo
{
private final Object LOCK = new Object();
public void importantMethodOne()
{
synchronized(LOCK)
{
// Method body here
}
}
public void importantMethodTwo()
{
synchronized(LOCK)
{
// Method body here
}
}
public void otherMethod()
{
// Method body here
}
public void cleanupMethod()
{
synchronized(LOCK)
{
// Method body here
}
}
}
锁监视器是一个互斥锁-一次只能有一个线程持有它,因此一次只能有一个线程调用importantMethodOne、importantMethodTwo或cleanupMethod。当另一个线程在范围内(因此具有锁)时,尝试调用其中任何一个方法的任何线程都将等待。在本例中,otherMethod可以在任何时候调用,而不中断任何其他操作,因为它不获取锁
请注意,在这种情况下,两个线程不能同时执行myMethod(),因为它们会相互阻塞。如果这是一个问题,您可以使用一个(允许多个“读者”同时持有它,但只有一个“作者”)来解决这个问题。如果您为“普通”方法获取读锁,为“清理”方法获取写锁,这将具有所需的语义。我想您可能会有这样的功能: (使用缩进,今天不想处理大括号) 时间还早,但我疲惫的大脑找不到问题——我稍后会重读,看看它是否仍然有意义
但是,您需要更多的同步逻辑来确保在清理过程中没有任何东西进入其中--我没有编写代码,因为今天我回答的是您提出的问题,而不是您想问的问题(其他人已经这样做了)如果“在这里做很多事情”引发异常,或者如果清理线程检查正在运行,该怎么办,如果得到一个错误的结果,其他线程会在清理操作完成之前调用run方法?@jambo是的,很好的观点是将busy放在finally子句中。不过我确实提到了你的第二点。我会修正你的观点。实际上,可以检查是否有其他线程正在执行任意方法。您可以在管理API中使用
ThreadMXBean
来获取所有活动线程的堆栈跟踪,遍历这些跟踪并检查是否找到相关方法。当然,您可以,但这取决于启用的JMX管理器。您也可以直接获取线程
引用,并在这些引用上调用getStackTrace()
,在StackTraceElements上进行匹配。这两个建议都不明智;首先,因为它们相当于在happy path案例中抛出许多异常;更重要的是,仍然没有同步。没有什么可设置的,当你根据结果触发一个方法时,刚刚返回的true
测试仍然是true
。实际上,我的答案告诉你如何完全按照他的要求执行。它没有回答他应该问的问题,你的回答了。非常正确,我会告诉你的。:-)
int busy;
public boolean is Running()
synchronized(lock1)
return busy != 0;
public void run()
try {
synchronized(lock1)
busy++
do lots of stuff here
} finally {
synchronized(lock1)
busy--
}