我有一个静态方法,我有兴趣立即返回,如果另一个线程调用它 例如。
public static void parseNetworkData() {
if(isRunning) {
return;
}
// get and cache network data
// for use
}
我真的不想同步该方法,因为如果网络通话已经完成,我也不希望其他线程也这样做。
现在我不确定以下内容:
考虑到这是一种静态方法,定义/处理isRunning
的最佳方法是什么?
我应该将其转换为实例方法吗?
答案 0 :(得分:4)
我有一个静态方法,我有兴趣立即返回,如果另一个线程调用它。
这听起来很让我怀疑,但你可以做到。方法static
不会对情况造成太大影响,但是做的任何方式都需要应用同步或并发支持对象来管理线程之间的交互。在这种情况下,java.util.concurrent.ReentrantLock
可以方便地提供您所需的内容:
class MyClass {
private static ReentrantLock networkDataLock = new ReentrantLock();
public static void parseNetworkData() {
if (!networkDataLock.tryLock()) {
// a different thread has the lock
return;
}
try {
// get and cache network data
// for use
} finally {
// If the lock was successfully acquired then it must be
// unlocked without fail before the method exits
networkDataLock.unlock();
}
}
}
答案 1 :(得分:2)
您可以使用Lock
:
public static void parseNetworkData() {
if(lockObj.tryLock()) {
//Perform method stuff
lockObj.unlock();
}
}
如果锁定已锁定,则不会发生任何事情。我认为,锁定将是private static final
变量。
答案 2 :(得分:0)
使旗帜变为静态
volatile static boolean isRunning