我有一个计划任务,需要在执行时启动同一个进程的多个线程,是否可以设置在进程启动时启动特定数量的线程?
在应用程序类中,我配置了以下 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/