多线程等待批量操作

Multiple Threads wait for batch operation

我有一个将多个任务提交到 ExecutorService 的进程,比如 MyTask。我的任务请求来自外部服务的值,例如 ExternalService。我想要做的是让 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 秒)并将结果返回给任务继续。

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

谢谢

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

CyclicBarriers are useful in programs involving a fixed sized party of threads that must occasionally wait for each other.

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

CyclicBarrier barrier = new CyclicBarrier(100, action);

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

barrier.await(1, TimeUnit.SECONDS);

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


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

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