我有一个进程,它将多个任务提交到ExecutorService,比如MyTask。我的任务请求来自外部服务的值,比如ExternalService。我试图做的是,外部服务批处理请求,比如每100个传入或每1秒,直到那个时间使MyTask线程保持不变直到他们得到答案:
public class MyTask implements Runnable {
@Override
public void run() {
try {
// .... code ....
ExternalData data = externalService.getData(id);
// ..... code after batch ...
}catch (Exception e){
}
}
}
我需要服务 externalService 来暂停 MyTask 直到它批量执行操作(通过累积100个请求或等待1秒)并返回结果继续完成任务。
解决此问题的最佳方法是什么?
谢谢
答案 0 :(得分:1)
这可以通过使用CyclicBarrier来完成。
CyclicBarriers在涉及固定大小的线程方的程序中非常有用,这些线程必须偶尔相互等待。
创建一个所有任务都可以访问的屏障。参数是您在调用await()
时要等待的任务量以及等待后要执行的操作:
CyclicBarrier barrier = new CyclicBarrier(100, action);
每个任务都应该调用await
。这将等到总共100个任务达到此点或最多1秒:
barrier.await(1, TimeUnit.SECONDS);
如果超时,无论如何都要运行action
。 action
是一个可以调用外部服务的runnable。由于action
同时运行,您可能还需要让您的任务等待它终止并获得结果。
要获得外部服务的实际结果,我可能会使用以下内容。基本上将ID保存在列表中并使其阻塞,直到结果准备就绪。
action.addId(id);
barrier.await(...); // run batch action using all IDs
result = action.getResult(id); // blocks until result is ready