Notre service de commande a généralement une commande à payer, et cette commande à payer est limitée dans le temps. Par exemple, la commande d'Alibaba est de cinq jours, la commande de Taobao est d'un jour, la commande de Pinduoduo est d'un jour, Mei Le groupe. la commande dure 15 minutes...
Dans le système de fonds, comment mettre à jour les informations de fonds dans plusieurs partitions de stockage en même temps...
En général, dans le développement réel, les minuteries doivent résoudre le problème de plusieurs minuteries fonctionnant à en même temps, et aussi Pour résoudre le problème des conflits entre timers
Ce n'est pas un gros problème En matière de concurrence, le multi-thread est indispensable... Jetez un œil et vous comprendrez
Nous Il est clair que les résultats d'exécution sont tous planifiés-1
On peut en conclure que le minuteur Springboot est monothread par défaut
Mais le problème se pose si après les threads se disputent les ressources. , un certain thread met beaucoup de temps à s'exécuter. Terminé, que faire des autres timers ? Ils ne peuvent entrer qu'en état d'attente, plus le temps est long, plus il y a de timers au total, ce qui peut facilement provoquer une avalanche. En fait, il vous suffit d'ajouter une classe de configuration et d'ajouter des annotations pour le résoudre. Problème
Ajouter une annotation
Le code spécifique est le suivant :
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; @Component public class SchedulerTaskController { private Logger logger= LoggerFactory.getLogger(SchedulerTaskController.class); private static final SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm:ss"); private int count=0; @Scheduled(cron="*/6 * * * * ?") @Async("threadPoolTaskExecutor") public void process(){ logger.info("英文:this is scheduler task runing "+(count++)); } @Scheduled(fixedRate = 6000) @Async("threadPoolTaskExecutor") public void currentTime(){ logger.info("中文:现在时间"+dateFormat.format(new Date())); } }
Classe de configuration
Le code spécifique est le suivant. suit :
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.ThreadPoolExecutor; /**使用多线程的时候,往往需要创建Thread类,或者实现Runnable接口,如果要使用到线程池,我们还需要来创建Executors, * 在使用spring中,已经给我们做了很好的支持。只要要@EnableAsync就可以使用多线程 * 通过spring给我们提供的ThreadPoolTaskExecutor就可以使用线程池。*/ //@Configuration 表示该类是一个配置类 @Configuration @EnableAsync //所有的定时任务都放在一个线程池中,定时任务启动时使用不同都线程。 public class TaskScheduleConfig { private static final int corePoolSize = 10; // 默认线程数 private static final int maxPoolSize = 100; // 最大线程数 private static final int keepAliveTime = 10; // 允许线程空闲时间(单位:默认为秒),十秒后就把线程关闭 private static final int queueCapacity = 200; // 缓冲队列数 private static final String threadNamePrefix = "it-is-threaddemo-"; // 线程池名前缀 @Bean("threadPoolTaskExecutor") // bean的名称,默认为首字母小写的方法名 public ThreadPoolTaskExecutor getDemoThread(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(keepAliveTime); executor.setKeepAliveSeconds(queueCapacity); executor.setThreadNamePrefix(threadNamePrefix); //线程池拒绝任务的处理策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //初始化 executor.initialize(); return executor; } }
Alors nous pouvons voir clairement :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!