我有一个如下的 Java 线程:
public class MyThread extends Thread {
MyService service;
String id;
public MyThread(String id) {
this.id = node;
}
public void run() {
User user = service.getUser(id)
}
}
我有大约 300 个 ID,每隔几秒钟 - 我会启动线程来调用每个 ID。例如。
for(String id: ids) {
MyThread thread = new MyThread(id);
thread.start();
}
现在,我想收集每个线程的结果,并批量插入数据库,而不是每 2 秒进行 300 次数据库插入。
知道我该如何做到这一点吗?
最佳答案
规范的方法是使用 Callable
和 ExecutorService
。 submit
将 Callable
传递给 ExecutorService
会返回一个(类型安全的)Future
,您可以从中 get
结果。
class TaskAsCallable implements Callable<Result> {
@Override
public Result call() {
return a new Result() // this is where the work is done.
}
}
ExecutorService executor = Executors.newFixedThreadPool(300);
Future<Result> task = executor.submit(new TaskAsCallable());
Result result = task.get(); // this blocks until result is ready
在您的情况下,您可能希望使用返回 Futures
的 List
的 invokeAll
,或者在添加任务时自己创建该列表给执行人。要收集结果,只需对每个结果调用 get
。
关于java - 从 Java 线程返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2314402/