如何在java中检查方法状态?

Sun*_*nil 2 java reflection

假设我有一个名为myMethod()的实例方法.我需要检查是否有任何线程正在执行该方法.有没有办法可以使用反射或其他API来检查这个?

我想在方法未执行时执行一些清理逻辑.因此需要检查方法是否正在运行.

And*_*yle 6

没有办法完全按照你所说的做(检查其他线程是否直接在方法内).

但是,这听起来像是同步的经典案例.使方法调用在某个对象的监视器上同步; 让你的清理代码在同一台显示器上同步,瞧!现在,如果任何线程正在运行您已同步的方法,则清理代码无法运行,但会等待所有线程退出方法然后继续.

这是一个例子:

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来解决这个问题(它允许许多"读者"同时持有它,但只有一个"编写者").如果获取"普通"方法的读锁定和"清理"方法的写锁定,则会具有所需的语义.