Java:同时更新状态

时间:2015-05-22 12:33:35

标签: java database multithreading

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

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

    这是安全的,但会杀死并发。

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

  • 我看到了并行执行状态更新的解决方案,但是这样一个任务的状态更新总是在一个线程上执行。如果将 runnables 放入队列中,它将保证一致性(稍后的状态更新将在先前的状态更新后执行)。

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

1 个答案:

答案 0 :(得分:1)

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

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);
     }
 }