Java:通过Timer调用方法,但被调用方法所做的更改不会保留在TimerTask之外

标签 java timer guava timertask multimap

我希望在一定的延迟后调用特定的方法。我尝试了不同的方法,例如计时器、执行器或处理程序。他们完成了自己应该做的事情,但也有一点异常(exception)。延迟的方法调用对 Guava 的多重映射进行了一些更改。在 TimerTask 的 run 方法中,输出就像我想要的那样。但是,如果我在 run 之外打印多重映射,则更改将被撤回,并且我仍然拥有旧的多重映射值。但我需要更新的值,因为我的数据保存在其中,并且我需要使用更新的值。

我的代码如下所示:

public class classTimer {
  public static void main(String[] args) {
    //some code, irrelevant for the task

             new Timer().schedule(new TimerTask() {          
             @Override
             public void run() {
                 dataMap = UndoManager.undoChanges(dataMap, a, hw); 
                 // Point 1  
                    }
                }, delay);  
                // Point 2
   }
 }

就像我之前所说的,在 Point1 打印 dataMap 会给出正确的输出,在 Point 2 打印旧值,就像新调用的方法 UndoChanges 一样。多重映射的实现使更改保持一致,通常值必须已更改,但此处情况并非如此。我在这里缺少什么?如果有人知道延迟后调用方法的不同方法,我会很高兴听到它。

感谢并非常感谢

最佳答案

代码中的第 2 点在您安排撤消任务后立即执行。这是因为 schedule 方法立即返回:它不会等待延迟过去并执行任务。这就是使用计时器的真正意义:安排异步任务在将来的某个时间运行。

关于Java:通过Timer调用方法,但被调用方法所做的更改不会保留在TimerTask之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19620781/

相关文章:

java - 插入数据时出现无效数据库路径错误

java - 来自 Spring <form :form> 的额外属性

c++ - 使用 C++ 以纳秒为单位提供时间的计时器功能

node.js - NodeJS setTimeout/setInterval 回调作为字符串

java - Guava 可选使用的快捷方式有异常(exception)吗?

java - 如何在 Java 中生成顺序整数的列表或数组?

scala - 如何从 Google Guava 序列化布隆过滤器?

java - 如何验证使用 mockito 调用公共(public)类的静态方法?

java - 休息电话的单元测试

java - 如何在android Activity 中每分钟运行一次代码?