@Schduled並列実行
10003 ワード
springが持っているタスクスケジュールはシリアルで実行されますが、シリアルで実行するという意味は何ですか?最初の方法は完成してから二番目の方法を実行します.栗を挙げます.もし私の二つの方法が一秒に一回実行するなら、最初の方法は実行時間が長いです.二番目の方法は一秒ごとに実行するのではなく、同じではないです.
@Component
public class Test{
@Scheduled(cron = "0/1 * * * * ?")
public void methodOne() {
log.error(" ...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Scheduled(cron = "0/1 * * * * ?")
public void methodTwo() {
log.error(" ...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
方法の一つの方法を同時に実行することをパラレルといいます.方法を考えてみます.もしまだ睡眠中の場合、彼が実行し終わっていないかどうかを問わず、直接に次を実行するなら、それは方法の非同期です.参考にしてください.https://blog.csdn.net/qq_38366063/articale/details/87005949、@Ayncを使って対応方法に注釈すればいいです.並列操作の配置類:import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
/**
*
**/
@Configuration
@EnableScheduling
@Slf4j
public class ScheduledConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
TaskScheduler scheduler = this.taskScheduler();
scheduledTaskRegistrar.setTaskScheduler(scheduler);
}
@Bean(destroyMethod = "shutdown")
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
scheduler.setThreadNamePrefix("task-");
scheduler.setAwaitTerminationSeconds(60);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
}
実行において、方法1の方法2が同時に実行されることを発見する.set PoolSizeをスレッド個数に設定し、1に設定するとシリアルを表し、実行時間が長い…タイミングタスクの量を見て適切にsizeを設定します.