java - 如何使用ExecutorService批量运行任务

标签 java multithreading

我正在尝试并行运行 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/

相关文章:

java - 如何诊断脚本语言中发生的 Java ClassNotFound 异常,而不是 Java 代码中发生的异常

c# - C# 线程真的可以缓存一个值并忽略其他线程对该值的更改吗?

Java - SQL 和线程 - 处理卡住

Objective-C 卡住 GUI 也带有队列

multithreading - 如何使用线程提高 pymongo 性能?

java - Guice jar 中的 Assisted 类在哪里?

java - Hadoop Mapreduce 计数器

java - 在Java中使用switch case作为条件语句

java - JPA JPQl 或 MySQL 中的存储过程

multithreading - 单体(对比)微服务 ==> 线程(对比)进程