假设我有一个名为myMethod()的实例方法.我需要检查是否有任何线程正在执行该方法.有没有办法可以使用反射或其他API来检查这个?
我想在方法未执行时执行一些清理逻辑.因此需要检查方法是否正在运行.
没有办法完全按照你所说的做(检查其他线程是否直接在方法内).
但是,这听起来像是同步的经典案例.使方法调用在某个对象的监视器上同步; 让你的清理代码在同一台显示器上同步,瞧!现在,如果任何线程正在运行您已同步的方法,则清理代码无法运行,但会等待所有线程退出方法然后继续.
这是一个例子:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
LOCK监视器是一个互斥锁 - 只有一个线程可以同时保存它,因此只有一个线程可以同时调用任何importantMethodOne,importantMethodTwo或cleanupMethod.尝试调用任何这些方法而另一个在范围内(因此具有锁定)的任何线程都将等待.在此示例中,可以随时调用otherMethod而不会中断任何其他内容,因为它不会获取锁定.
请注意,在这种情况下,两个线程不能同时执行myMethod(),因为它们会相互阻塞.如果这是一个问题,你可以使用ReadWriteLock来解决这个问题(它允许许多"读者"同时持有它,但只有一个"编写者").如果获取"普通"方法的读锁定和"清理"方法的写锁定,则会具有所需的语义.