Java:同时更新状态

标签 java database multithreading

  • 我有很多任务,它们都有状态。状态被保存到数据库中。目前我将所有状态保存在一个线程中:

    executor = Executors.newSingleThreadExecutor();
    ...
    executor.submit(new UpdateStatusTask(taskId, status));
    

    这是安全的,但会破坏并发性。

  • 另一方面,如果我添加更多线程,可能会导致数据损坏——较早的任务状态可能会被较早的任务覆盖。

  • 我看到一个并行执行状态更新的解决方案,但在这种方式下,一个任务的状态更新总是在单个线程上执行。如果将 runnables 放入队列中,它将保证一致性(较晚的状态更新在较早的状态更新之后执行)。

是否有任何标准/Apache/Guava 等实用程序类来执行此类任务?

最佳答案

您应该通过同一线程更新同一任务的状态。

public class TaskStatusUpdater {

    private final int threadCount;
    private final ExecutorService[] executors;

    public TaskStatusUpdater(int threadCount) {
         this.threadCount = threadCount;
         executors = new ExecutorService[threadCount];
         for (int i = 0; i < threadCount; i++) {
             executors[0] = Executors.newSingleThreadExecutor();
         }
    }

    public void submitTask(int taskId, Runnable task) {
         int index = Integer.hashCode(taskId) % threadCount;
         executors[index].submit(task);
     }
 }

关于Java:同时更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30396857/

相关文章:

iphone - 与 iPhone 和 Web 服务双向同步

java - run() 方法和其他类方法(java 线程)之间的通信

c++ - 无法弄清楚竞争条件发生在哪里

ios - 对 NSURLRequest 进行排队以模拟同步、阻塞请求

database - 小文件海量存储策略

database - 如何使 Firebase 与另一个数据库保持同步

java - 如何在没有 ORM 的情况下对 DAO 进行单元测试

java - 避免计时器java上的屏幕闪烁

java - java中一个线程占用多少内存

java - 调整大小后未调用 LibGDX 渲染