在下面的场景中需要不同的想法,假设从ResultSet
的{{1}}方法获得了一个Statement
对象,这个execute()
对象可能包含数千条记录,我在这里将每个ResultSet
对象的数据更新为DTO对象。
得到ResultSet
,现在我想在一个线程中处理每个DTO,最多5个线程,即5个DTO对象。
(剩余的DTO应该等待完成至少一个线程执行,如果一个线程完成它的工作想要添加另一个线程,那么它又是5个线程正在运行..所以进程将继续所有DTO对象)
实施此类要求的可行方法有哪些?
提前感谢您的时间和建议。
答案 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
取消任务,等待完成任务,检索结果并执行其他操作。