Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中检查方法状态?_Java_Reflection - Fatal编程技术网

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

如何在java中检查方法状态?,java,reflection,Java,Reflection,假设我有一个名为myMethod()的实例方法。我需要检查是否有线程正在执行该方法。有没有一种方法可以使用反射或其他API来检查这一点 我想在方法未执行时执行一些清理逻辑。因此需要检查该方法是否正在运行。没有办法完全按照您所说的去做(直接检查其他线程是否在方法内部) 然而,这听起来像是一个典型的例子。使方法调用在某个对象的监视器上同步;让你的清理代码在同一个监视器上同步,瞧!现在,如果任何线程正在运行已同步的方法,则清理代码将无法运行,但将等待所有线程退出这些方法,然后继续 下面是一个例子: p

假设我有一个名为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
        }
    }
}
锁监视器是一个互斥锁-一次只能有一个线程持有它,因此一次只能有一个线程调用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--
    }