gpt4 book ai didi

Java - 为什么静态 block 中的方法没有及时加载?

转载 作者:行者123 更新时间:2023-11-28 21:19:45 28 4
gpt4 key购买 nike

我编写了一个方法 processMetrics,如果包含数据的文件自上次请求以来已更新,它会加载新指标。我希望该方法每 10 秒执行一次,因此决定为此目的使用 ExecutorService

但是,当我测试使用配置的类中的方法时。我可以看到调用该方法时执行程序没有从静态 block 加载配置。当我在没有先调用注释行的情况下运行测试时,它返回 false,因为没有更新配置。但是当我运行 MetricsProcessor.isMetricValid("Metric_1"); 然后 assertTrue(MetricsProcessor.isMetricValid("Metric_1"));配置已加载,测试返回 true。

什么会导致这种行为?我得出的结论是,这是因为 MetricsProcessor 类没有及时加载。这是一个有效的假设吗?

此外,我已经设法通过在执行程序之前的静态 block 的第一行中显式调用 processMetrics(); 来解决问题。但是还是不太明白为什么会这样?

@Test
public void testIsMetricValid() {
// MetricsProcessor.isMetricValid("Metric_1");
assertTrue(MetricsProcessor.isMetricValid("Metric_1"));
}


// MetricsProcessor is a final class
private static Runnable loadMetrics = MetricsProcessor::processMetrics;
private static ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

static {
executor.scheduleAtFixedRate(processMetrics, 0, 10, TimeUnit.SECONDS);
}

private static void processMetrics() {
{
long metricsLastMod = metricsFile.lastModified();

if (metricsLastMod > lastMod.get()) {
processMetricsData(metricsFile);
lastMod.set(metricsLastMod);
}
}

最佳答案

您正面临竞争条件。有两个线程:

  • 加载你的类然后运行测试
  • 执行计划任务

在某些情况下,调度程序可能比您的测试启动得更快。但不能保证。因此,为了防止竞争条件,您至少需要确保第一次执行您的任务。

这是解决方案之一:

private static Runnable loadMetrics = MetricsProcessor::processMetrics;
private static ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

static {
loadMetrics.run();
// Note the updated initial delay.
executor.scheduleAtFixedRate(loadMetrics, 10, 10, TimeUnit.SECONDS);
}

关于Java - 为什么静态 block 中的方法没有及时加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53257649/

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