内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我有一个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个数据库。
知道我怎么能做到这一点吗?
如果要在进行数据库更新之前收集所有结果,则可以使用invokeAll
方法。
private static final ExecutorService workers = Executors.newCachedThreadPool(); ... Collection<Callable<User>> tasks = new ArrayList<Callable<User>>(); for (final String id : ids) { tasks.add(new Callable<User>() { public User call() throws Exception { return svc.getUser(id); } }); } /* invokeAll blocks until all service requests complete, * or a max of 10 seconds. */ List<Future<User>> results = workers.invokeAll(tasks, 10, TimeUnit.SECONDS); for (Future<User> f : results) { User user = f.get(); /* Add user to batch update. */ ... } /* Commit batch. */ ...