多个线程等待批处理操作

时间:2015-01-24 20:20:08

标签: java multithreading concurrency batch-processing

我有一个进程,它将多个任务提交到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秒)并返回结果继续完成任务。

解决此问题的最佳方法是什么?

谢谢

1 个答案:

答案 0 :(得分:1)

这可以通过使用CyclicBarrier来完成。

  

CyclicBarriers在涉及固定大小的线程方的程序中非常有用,这些线程必须偶尔相互等待。

创建一个所有任务都可以访问的屏障。参数是您在调用await()时要等待的任务量以及等待后要执行的操作:

CyclicBarrier barrier = new CyclicBarrier(100, action);

每个任务都应该调用await。这将等到总共100个任务达到此点或最多1秒:

barrier.await(1, TimeUnit.SECONDS);

如果超时,无论如何都要运行actionaction是一个可以调用外部服务的runnable。由于action同时运行,您可能还需要让您的任务等待它终止并获得结果。


要获得外部服务的实际结果,我可能会使用以下内容。基本上将ID保存在列表中并使其阻塞,直到结果准备就绪。

action.addId(id);
barrier.await(...); // run batch action using all IDs
result = action.getResult(id); // blocks until result is ready