Java 通过超时以恒定可用性更新集合

Java 通过超时以恒定可用性更新集合,java,scala,flink-streaming,Java,Scala,Flink Streaming,是否有Java/Scala集合列表、数组或类似的东西在给定的超时后自动更新整个集合内容?但是有一个特性,更新将发生在另一个线程中,旧数据将在更新期间可用 我的例子是使用定期更新的集合来丰富Flink流,我从PostgreSQL获取这些集合的数据。我不需要为每条消息查询数据库。我每N分钟从表中下载一次完整的数据,并从表中选择*。我不想暂停更新数据。Viktor 我想缓存是您可以使用的最佳解决方案之一。但如果您不知道缓存,下面的答案将帮助您 解决方案 您可以使用TimerTask类及时运行特定的方法

是否有Java/Scala集合列表、数组或类似的东西在给定的超时后自动更新整个集合内容?但是有一个特性,更新将发生在另一个线程中,旧数据将在更新期间可用

我的例子是使用定期更新的集合来丰富Flink流,我从PostgreSQL获取这些集合的数据。我不需要为每条消息查询数据库。我每N分钟从表中下载一次完整的数据,并从表中选择*。我不想暂停更新数据。

Viktor

我想缓存是您可以使用的最佳解决方案之一。但如果您不知道缓存,下面的答案将帮助您

解决方案

您可以使用TimerTask类及时运行特定的方法。下面这个简单的例子会给你一个想法

ListUpdater,它是TimerTask子项

导入java.util.TimerTask

公共类ListUpdater扩展TimerTask{

  @Override
  public void run() {

    // You can write your code to update your list.
    System.out.println("Updating list");

  }
}

应用程序类

公开课考试{ 公共静态无效字符串[]args{

    TimerTask task = new ListUpdater();

    Timer timer = new Timer();
    timer.schedule(task, 1000,6000);
 }
}

在此示例中,计时器将每6秒打印一次“更新列表”消息,第一次执行时延迟1秒

java中有很多线程安全的集合,您可以自由使用其中的任何一个

ConcurrentLinkedQueue 阵列锁定队列 LinkedBlockingDeque LinkedBlockingQueue 优先阻塞队列 同步队列 延迟队列 或者创建一个全新的线程安全列表:


List newList=Collections.synchronized listnew ArrayList;

您可能需要使用一个缓存系统,该系统将根据生存时间、读/写通过等为您提供逐出策略。是的,使用JCache进行缓存可能是满足您特定需要的最佳方式,直到生存时间结束,您从缓存中获取数据,并且一旦数据被删除完成后,它将查询数据库并放入缓存。而且它是线程安全的。