如果已经调用了另一个线程,则不调用静态方法

时间:2016-06-28 20:29:17

标签: java multithreading oop concurrency

我有一个静态方法,我有兴趣立即返回,如果另一个线程调用它 例如。

public static void parseNetworkData() {  
   if(isRunning) {  
     return;
   }  
   // get and cache network data  
   // for use  
}  

我真的不想同步该方法,因为如果网络通话已经完成,我也不希望其他线程也这样做。
现在我不确定以下内容:
考虑到这是一种静态方法,定义/处理isRunning的最佳方法是什么? 我应该将其转换为实例方法吗?

3 个答案:

答案 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