Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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_Multithreading_Oop_Concurrency - Fatal编程技术网

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

Java 如果已调用另一个线程,则不调用静态方法,java,multithreading,oop,concurrency,Java,Multithreading,Oop,Concurrency,我有一个静态方法,如果另一个线程调用它,我希望立即返回该方法。 例如 我真的不想同步该方法,因为如果网络调用已经完成,我不希望其他线程也这样做。 现在我不确定以下几点: 考虑到这是一种静态方法,定义/处理isRunning的最佳方法是什么? 我应该将其转换为实例方法吗?您可以使用锁: public static void parseNetworkData() { if(lockObj.tryLock()) { //Perform method stuff lo

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

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

我应该将其转换为实例方法吗?

您可以使用
锁:

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

如果锁已锁定,则不会发生任何事情。锁将是一个
私有静态final
变量,我认为。

使标志易变且静态

volatile static boolean isRunning
我有一个静态方法,如果另一个线程调用它,我希望立即返回它

这听起来很可疑,但你可以做到。该方法是
静态的
不会对这种情况产生太大影响,但是您确实需要应用同步或并发支持对象来管理线程之间的交互。在这种情况下,
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();
        }
    }  
}

如果一个线程调用该方法,而另一个线程正在其中运行,那么该方法将返回什么?@JohnBollinger:你说得对。这令人困惑。其思想是,代码应该更新某些内容,并且并非在所有情况下都真正需要返回值。我将更新OPU,您可以同步该方法并生成一个静态实例变量,用于跟踪parseNetworkData()是否运行(布尔值)。当需要再次运行布尔值时,再次将布尔值设置为false,使该标志变为volatile,并static@CSK:但是另一个线程不需要阻止另一个线程来完成为什么会有问题?@Jim,考虑到两个或多个线程希望执行该方法的工作,坚持只有一个线程实际执行该工作是合理的。但是,您可能认为其他线程可以在工作实际完成之前继续工作。怀疑,但这不是不可能的。@Jim,如果线程可以有效地继续,至少可以持续一段时间,那么您可能希望查看返回一个
将来的
,如果需要,它们可以使用它来等待结果,当他们最终准备好使用它时。为了给你们更多的上下文,一个线程正在做一些事情,从网络中获取数据,若缓存/缓存/显示到UI中并没有任何内容。另一个线程定期获取数据并在后台更新缓存。因此,有一种情况是,后台线程的“工作”将由另一个“UI”来完成,比如说线程。因此,另一个线程只是跳过,因为它将在下一次定期运行中进行调用。这有意义吗?@吉姆,这是你的软件。当然,您可以控制更新何时运行。如果只有一个线程运行更新,那么您根本不必担心排除其他线程。
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();
        }
    }  
}