我有一个任务,我想并行运行500次,如果我只想运行一次,我会这样做
Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(
taskProvider.get(),
0,
100,
TimeUnit.MILLISECONDS
);我想运行我从任务提供者获得的500个任务(高IO),与固定速率并行,是否有一种方法可以做到这一点,而不创建500个执行者或提交500个任务在一个时间循环?
编辑:我知道我可以创建一个大小为500的线程池,如果我这样做,我必须提交500个任务(?)为了并行运行,我在寻找一种不提交类似任务的方法,因为它们基本上都有相同的内容,我也不想同时启动它们,我希望每100 is启动50次。
发布于 2018-01-04 08:58:46
您必须手动完成此操作:
void submitTaskChunks(int chunkCount, int chunkSize, long delayMillis) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < chunkCount; i++) {
List<Callable<Void>> taskChunk = IntStream.range(0, chunkSize)
.mapToObj(k -> taskProvider.get())
.collect(Collectors.toList());
executorService.invokeAll(taskChunk);
Thread.sleep(delayMillis);
}
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.MINUTES);
}每100 ms提交50个任务10次:submitTaskChunks(10, 50, 100);注意到taskProvider.get应该返回Callable<Void>。
发布于 2018-01-04 08:36:48
您可以创建大小为500的任务列表,并使用
ExecutorService executor = Executors.newFixedThreadPool(500);
executor.invokeAll(tasks);https://stackoverflow.com/questions/48090946
复制相似问题