假设我有一个名为myMethod()的实例方法。我需要检查是否有任何线程正在执行该方法。有没有办法可以使用反射或其他API检查这个?
我想在方法未执行时执行一些清理逻辑。因此需要检查方法是否正在运行。
答案 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--
}
现在还早,但是我的疲惫大脑无法找到问题 - 我会在以后重新阅读,看看它是否仍然有意义。
但是你需要更多的同步逻辑来确保在你清理时没有任何东西进入它 - 我没有编码,因为今天我回答你问的问题,而不是你要问的问题(其他已经那样做了)