Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyelesaikan konflik pemasa berbilang dalam Spring Boot

Bagaimana untuk menyelesaikan konflik pemasa berbilang dalam Spring Boot

王林
王林ke hadapan
2023-05-17 08:07:051692semak imbas

Senario Penggunaan

Perkhidmatan pesanan kami secara amnya mempunyai pesanan yang perlu dibayar, dan pesanan yang perlu dibayar ini adalah masa yang terhad. Contohnya, pesanan Alibaba adalah lima hari, dan pesanan Taobao adalah satu hari mengambil satu hari, pesanan Meituan mengambil masa 15 minit...

Dalam sistem dana, cara mengemas kini maklumat dana dalam berbilang partition storan pada masa yang sama...

Secara amnya, ia adalah sebenarnya dalam pembangunan Pemasa perlu menyelesaikan masalah berbilang pemasa berjalan serentak pada masa yang sama, serta masalah konflik antara pemasa

Ia bukan masalah besar Apabila ia datang kepada concurrency, multi-threading tidak boleh dipisahkan... Lihatlah saya faham

Penghasilan semula senario masalah

Bagaimana untuk menyelesaikan konflik pemasa berbilang dalam Spring Boot

Bagaimana untuk menyelesaikan konflik pemasa berbilang dalam Spring Boot

Kami jelas melihat bahawa pelaksanaan keputusan semuanya dijadualkan-1

Boleh disimpulkan bahawa pemasa Springboot lalai adalah satu-benang

Tetapi masalah timbul Jika selepas benang bersaing untuk mendapatkan sumber, benang tertentu mengambil masa yang lama untuk melengkapkan, kemudian lain Tidak kira apa yang anda lakukan dengan pemasa, anda hanya boleh memasuki keadaan menunggu Semakin lama masa, semakin banyak pemasa yang anda perlu tunggu, yang boleh menyebabkan runtuhan salji dengan mudah...

Malah, anda hanya perlu menambah kelas konfigurasi dan menambah anotasi untuk menyelesaikannya

Tambah anotasi

Bagaimana untuk menyelesaikan konflik pemasa berbilang dalam Spring Boot

Kod khusus adalah seperti berikut:

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()));
    }
}

Kelas konfigurasi

Bagaimana untuk menyelesaikan konflik pemasa berbilang dalam Spring Boot

Kod khusus adalah seperti berikut:

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;
    }
}

Kemudian kita dapat melihat dengan jelas:

Bagaimana untuk menyelesaikan konflik pemasa berbilang dalam Spring Boot

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan konflik pemasa berbilang dalam Spring Boot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam