【问题标题】:Not calling a static method if another thread is already called it如果已经调用了另一个线程,则不调用静态方法
【发布时间】:2016-06-28 20:29:17
【问题描述】:

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

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

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

【问题讨论】:

  • 如果方法被一个线程调用,而另一个线程正在其中运行,它预期返回什么?
  • @JohnBollinger:你是对的。这令人困惑。这个想法是代码应该更新一些东西,并且在所有情况下都不需要返回值。我会更新OP
  • 您可以同步方法并创建一个静态实例变量来跟踪 parseNetworkData() 是否运行(布尔值)。并在需要再次运行时再次将布尔值设置为 false
  • 使标志可变和静态
  • @CSK:但是另一个线程不需要阻塞其他线程完成

标签: java multithreading oop concurrency


【解决方案1】:

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

这对我来说听起来很可疑,但你可以做到。方法是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();
        }
    }  
}

【讨论】:

  • 为什么可疑?
  • @Jim,鉴于两个或多个线程希望执行该方法的工作,坚持只有一个线程实际执行该工作是合理的。但是,您怀疑其他线程可以在工作实际上完成之前继续有效。怀疑,但并非不可能。
  • @Jim,如果线程 可以 有用地继续,至少在一段时间内,那么也许你想考虑返回一个Future,它们可以用来等待结果,如有必要,当他们最终准备好使用它时。
  • 为了给你更多的上下文,一个线程正在做一些事情,如果缓存/缓存/显示中没有任何东西可以从网络获取数据。另一个线程定期获取数据并在后台更新缓存。所以有一种情况是后台线程的“工作”将由另一个“UI”完成,比如说线程。因此,另一个线程只是跳过,因为它将在下一次定期运行中进行调用。这有意义吗?
  • @Jim,它是你的软件。当然,您可以控制更新何时运行。如果只有一个线程运行更新,那么您根本不必担心排除其他线程。
【解决方案2】:

你可以使用Lock:

public static void parseNetworkData() {
    if(lockObj.tryLock()) {
       //Perform method stuff
       lockObj.unlock();
    }
}

如果锁已经被锁定,什么都不会发生。我认为 Lock 是一个 private static final 变量。

【讨论】:

    【解决方案3】:

    使标志可变和静态

    volatile static boolean isRunning
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2013-10-18
      • 2011-05-20
      • 2022-11-18
      相关资源
      最近更新 更多