返回结果时保持提交任务的顺序

时间:2014-09-23 13:28:07

标签: java multithreading

情况如下:

我想使用多线程方法将对应于图像的一些特征向量存储到数据库中。 问题是,在我给定的实现(我使用固定的线程池)我没有任何保证输出的顺序。由于我给越来越多的数字作为将数据放在数据库中的位置的索引,这会影响顺序并使其无法访问。

如果有更多细节可以使问题更清楚:

  • 我有很多矢量存储为每个图像/矢量的csv文件1个文件。
  • 每个任务都在读取csv文件,计算其他一些索引
  • 使用Runnable的实现来读取,计算索引等,然后
  • 调用synchronized方法在db中进行实际索引。

有没有办法强制输出的顺序与提交的任务的顺序相同?换句话说,如果首先提交了向量i,则应首先将向量i编入索引。

1 个答案:

答案 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_;
    }

}