如何应用多线程来处理List <mydto> 5 dto对象

时间:2016-07-30 05:39:58

标签: java multithreading threadpool executorservice threadpoolexecutor

在下面的场景中需要不同的想法,假设从ResultSet的{​​{1}}方法获得了一个Statement对象,这个execute()对象可能包含数千条记录,我在这里将每个ResultSet对象的数据更新为DTO对象。

得到ResultSet,现在我想在一个线程中处理每个DTO,最多5个线程,即5个DTO对象。

(剩余的DTO应该等待完成至少一个线程执行,如果一个线程完成它的工作想要添加另一个线程,那么它又是5个线程正在运行..所以进程将继续所有DTO对象)

实施此类要求的可行方法有哪些?

提前感谢您的时间和建议。

2 个答案:

答案 0 :(得分:0)

使用

public class YourTask implements Callable<String> {

//Ctor
YourTask(data) {
   // save data in member variables
}

public String call() throws Exception {
    // Process data
    // return string

}

}

ExecutorService threadPool = Executors.newFixedThreadPool(5); 
List<java.util.concurrent.Future<String>> futures = new ArrayList<Future<String>>();


for (your data) {
    futures.add(threadPool.submit(new YourTask(pass_data)));
}

// Wait for threads to finish i.e. join them
for (Future<String> f :futures){
        try {
            String c = f.get();
            doneCount++;

        } catch (InterruptedException e) {
            //
        } catch (ExecutionException e) {
            //
        }
            }

答案 1 :(得分:0)

具有固定线程池的

ExecutorService专门用于此类任务:

// Task that will process DTOs
public class DTOTask implements Callable<Void> {
    private MyDTO obj;

    public DTOTask(MyDTO obj) {
        this.obj = obj;
    }

    @Override
    public Void call() {
        // Process obj here
    };
}

ExecutorService executor = Executors.newFixedThreadPool(5);

Future<?> future = executor.submit(new DTOTask(myDObject));

您可以使用future取消任务,等待完成任务,检索结果并执行其他操作。