gpt4 book ai didi

java - 定期更新静态变量的正确方法

转载 作者:行者123 更新时间:2023-11-29 07:08:47 25 4
gpt4 key购买 nike

我有一个在类(class)开始时加载的静态变量。我想每小时更新一次变量。问题是这样做的正确方法是什么?

我尝试这样做的方式如下,但它需要在每个构造函数中更新静态变量的方法:

import java.util.Date;

public class MyClass {

private static String globalString = "";

// initialize lastUpdate with two hours back to make sure first update happens
private static Date lastUpdate = new Date(System.currentTimeMillis() - (2 * (3600 * 1000)));


MyClass() {
updateGlobalString();

// DO MORE STUFF HERE...
}


MyClass(String string) {
updateGlobalString();

// DO MORE STUFF HERE...
}

private synchronized void updateGlobalString() {
// check if we need to update
if (lastUpdate.before(new Date(System.currentTimeMillis() - (3600 * 1000)))) {

// DO THINGS TO UPDATE globalString HERE...

lastUpdate = new Date();
}
}
}

还有其他想法/更好的方法吗?

最佳答案

您应该使用某种计时器来进行更新。

例如,使用 ScheduledExecutorService 让任务每小时运行一次,更新字段。像这样:

public class MyClass {

private static volatile String globalString;
private static ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();

static {
exec.scheduleAtFixedRate(new Runnable() {
public void run() {
// DO THINGS TO UPDATE globalString HERE...
}
},
0, 1, TimeUnit.HOUR);
}

// Rest of class, without having to worry about the updateGlobalString
// method, or the lastUpdate variable, or anything like that
...
}

请注意,由于多个线程正在访问该变量,因此您需要确保您的代码是线程安全的。 (上面的计时器示例肯定是这种情况,但您当前的方法也可能是这种情况。)

简单地确保看到更新的最简单方法是将 globalString 变量标记为 volatile,但根据类的使用方式,其他方法可能更合适.

关于java - 定期更新静态变量的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16466373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com