我正在尝试并行运行 8 个任务,然后 hibernate 一段时间,然后再次运行新任务? 我怎样才能实现这一目标?
我尝试使用ExecutorService
,但我似乎没有得到正确的结果。
我有 1000 个文件,每个任务应该读取一个文件,并将其内容保存到数据库中。
这似乎不起作用:
ExecutorService executorService = Executors.newFixedThreadPool(8);
for ( int i = 1 ; i <= filesInDirectory ; i++ ) {
executorService.submit( new Importer( service ) );
Thread.sleep( Duration.ofSeconds( 10 ).toMillis() ) ;
}
executorService.shutdown();
我希望执行器同时运行所有 8 个线程,然后 hibernate 10 秒,然后再次以 8 个线程启动。
如何实现这一目标?
最佳答案
取模
使用modulo operator %
确定每 8 个数字:
if( ( i % 8 ) == 0 ) { … }
模给出除法后的余数。因此,8 的偶数倍的数可以被 8 整除,余数为零。如果一个数模八为零,我们就有偶数倍。
此外,您忘记等待任务完成。调用awaitTermination
在您的执行人服务上。
ExecutorService executorService = Executors.newFixedThreadPool(8);
for ( int i = 1 ; i <= filesInDirectory ; i++ ) {
executorService.submit( new Importer( service ) );
// On every 8th loop, sleep.
if( ( i % 8 ) = 0 ) {
Thread.sleep( Duration.ofSeconds( 10 ).toMillis() ) ;
}
}
executorService.shutdown(); // Ask service to shut down after all submitted tasks are done/failed/canceled.
executorService.awaitTermination( … , TimeUnit.… ); // Flow-of-control blocks, waiting until all submitted tasks are done/failed/canceled.
请注意,您提交的八个任务在等待十秒后可能会也可能不会完成。后台线程按照自己的时间表进行自己的进度,而不管该线程是否处于 sleep 状态。如果之前提交的 8 个任务尚未完成/失败/取消,执行器服务将缓冲下一组提交的 8 个任务,直到有线程可用。
关于java - 如何使用ExecutorService批量运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66723919/