我有很多任务,它们都有状态。状态被保存到数据库中。目前我将所有状态保存在一个线程中:
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/