我有很多任务,都有状态。状态持久保存到数据库。目前,我将所有状态保存在一个线程中:
executor = Executors.newSingleThreadExecutor();
...
executor.submit(new UpdateStatusTask(taskId, status));
这是安全的,但会杀死并发。
另一方面,如果我添加更多线程,可能会导致数据损坏 - 以后的任务状态可能会被更早的任务状态覆盖。
我看到了并行执行状态更新的解决方案,但是这样一个任务的状态更新总是在一个线程上执行。如果将 runnables 放入队列中,它将保证一致性(稍后的状态更新将在先前的状态更新后执行)。
是否有任何标准/ Apache / Guava等实用程序类来执行此类任务?
答案 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);
}
}