@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を設定します.