java - 如何在 Java 中运行同一进程的多个线程 - Spring Boot

标签 java multithreading spring-boot

我有一个计划任务,需要在执行时启动同一个进程的多个线程,是否可以设置在进程启动时启动特定数量的线程?

在应用程序类中,我配置了以下 TaskExecutor beans

    @Bean("threadFooExecutor")
    public TaskExecutor getFooExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(1000);
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setThreadNamePrefix("Foo-");
        return executor;
    }```

    @Bean("threadBarExecutor")
    public TaskExecutor getBarExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(1000);
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setThreadNamePrefix("Bar-");
        return executor;
    }

进程类中配置的异步进程

    @Async("threadFooExecutor")
    @Scheduled(fixedRate = 3000, initialDelay = 5000)
    public void print() {
        System.out.println(Thread.currentThread().getName() + " " + 1);
        System.out.println(Thread.currentThread().getName() + " " + 2);
        System.out.println(Thread.currentThread().getName() + " " + 3);
        System.out.println(Thread.currentThread().getName() + " " + 4);
    }

    @Async("threadBarExecutor")
    @Scheduled(fixedRate = 3000, initialDelay = 5000)
    public void print2() {
        System.out.println(Thread.currentThread().getName() + " " + 1);
        System.out.println(Thread.currentThread().getName() + " " + 2);
        System.out.println(Thread.currentThread().getName() + " " + 3);
        System.out.println(Thread.currentThread().getName() + " " + 4);
    }

我希望看到每个线程中有 2 或 3 个同时运行,但我只看到每个线程每 3 秒运行一次

最佳答案

我认为您混合了一些东西:TaskExecutor/Executor 配置和调度程序执行任务的频率。

此配置意味着任务将每 3 秒执行一次:

@Scheduled(fixedRate = 3000, ...)

添加:@Async("threadBarExecutor") 只是意味着调度程序将使用特定的 Executor 来运行任务。

这并不意味着它会在配置的Executor中的线程池大小未满时执行。
所以是的,这两个任务每 3 秒触发一次看起来很正常。

如果你想每 3 秒并行运行这些任务特定次数,@Scheduled 是不够的。
您应该使调度程序方法调用另一个 @Asynch 方法。这可以在同一个 bean 或另一个 bean 中定义,你并不重要。

@Async("threadFooExecutor")
@Scheduled(fixedRate = 3000, initialDelay = 5000)
public void printRepeat3Times() {
    for (int i=0; i<3; i++){
         print();
    }
}


@Async("threadFooExecutor")
public void print() {
     // ...
}

请注意,由于这些方法使用 @Asynch 注释,print() 调用不会“阻塞”当前线程,因此这些方法可以并行执行,谢谢到引擎盖下的 ExecutorService

关于java - 如何在 Java 中运行同一进程的多个线程 - Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56699244/

相关文章:

java - 如何使用优先级正则表达式/模式匹配拆分一行,Java

java - 如何将图像保存到指定位置?

java - 如何使用 JAVA 在 MATLAB 中进行显式多线程处理?

spring - 无法启动网络关闭的引导项目

spring - 如何在 spring-boot-starter-data-rest 中为 Swagger 文档实现 snake_case?

java - Android 拍照并保存到变量

java - Spring Boot 响应实体不返回 JSON

hadoop - 使用Spring Boot在Kerberized kafka集群到hadoop集群之间的数据流

multithreading - 如何编写多线程perl脚本来写入日志文件?

c++ - 如何访问lambda函数中的变量? (c++)