情况如下:
我想使用多线程方法将对应于图像的一些特征向量存储到数据库中。 问题是,在我给定的实现(我使用固定的线程池)我没有任何保证输出的顺序。由于我给越来越多的数字作为将数据放在数据库中的位置的索引,这会影响顺序并使其无法访问。
如果有更多细节可以使问题更清楚:
Runnable
的实现来读取,计算索引等,然后synchronized
方法在db中进行实际索引。有没有办法强制输出的顺序与提交的任务的顺序相同?换句话说,如果首先提交了向量i
,则应首先将向量i
编入索引。
答案 0 :(得分:1)
使用ExecutorService按顺序创建任务。
使用executor.invokeAll来调用(启动)线程/任务。
将future.get()用于按照提交顺序执行的任务结果。
ExecutorService executor = Executors.newFixedThreadPool(numberOfThread);
List<Task> threads = new ArrayList<>();
// create the threads
for (Integer key_ : dbIdList) {
threads.add(new Task(key_));
}
try {
//launch the threads
List<Future<String>> futures = executor.invokeAll(threads);
//read results
for (Future<String> future_ : futures) {
System.out.println(future_.get()); // this preserves the order of the tasks
}
} catch (Exception e) {
} finally {
//shut down
executor.shutdown();
}
完成任务的线程类:
class Task implements Callable<String> {
Integer dbId = null;
@Override
public String call() throws Exception {
//do whatever works needs to be done
return output;
}
public Task(int dbId_) {
this.dbId = dbId_;
}
}