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

时间:2010-08-10 16:29:26

标签: java reflection

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

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

2 个答案:

答案 0 :(得分:6)

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

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

LOCK监视器是一个互斥锁 - 只有一个线程可以同时保存它,所以只有一个线程可以同时调用任何importantMethodOne,importantMethodTwo或cleanupMethod。尝试调用任何这些方法而另一个在范围内(因此具有锁定)的任何线程都将等待。在这个例子中,可以随时调用otherMethod而不会中断其他任何事情,因为它不会获得锁定。

请注意,在这种情况下,两个线程不能同时执行myMethod(),因为它们会阻塞彼此。如果这是一个问题,你可以使用ReadWriteLock来解决这个问题(它允许许多“读者”同时持有它,但只有一个“作者”)。如果获得“普通”方法的读锁定和“清理”方法的写锁定,则会产生所需的语义。

答案 1 :(得分:-1)

我想你可以这样: (使用缩进,不要觉得今天要用牙箍处理)

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--
    }

现在还早,但是我的疲惫大脑无法找到问题 - 我会在以后重新阅读,看看它是否仍然有意义。

但是你需要更多的同步逻辑来确保在你清理时没有任何东西进入它 - 我没有编码,因为今天我回答你问的问题,而不是你要问的问题(其他已经那样做了)