Rumah >Java >javaTutorial >Bagaimana untuk melaksanakan kumpulan benang Springboot sendiri

Bagaimana untuk melaksanakan kumpulan benang Springboot sendiri

王林
王林ke hadapan
2023-06-28 16:33:05914semak imbas

Satu: ThreadPoolTaskExecuto

1 ThreadPoolTaskExecutor Kumpulan benang:

ThreadPoolTaskExecutor ialah enkapsulasi sekunder Spring berdasarkan kumpulan benang Java sendiri ThreadPoolExecutor. Tujuan utamanya adalah untuk menjadikannya lebih mudah dalam rangka kerja Kolam Benang Spring

2 Gunakan ThreadPoolTaskExecutor untuk menyuntik kacang ke dalam ioc
Borang fail konfigurasi, Spring akan mengkonfigurasi secara automatik

## 默认线程池配置,ThreadPoolTaskExecutor 
# 核心线程数
spring.task.execution.pool.core-size=8  
# 最大线程数
spring.task.execution.pool.max-size=16
# 空闲线程存活时间
spring.task.execution.pool.keep-alive=60s
# 是否允许核心线程超时
spring.task.execution.pool.allow-core-thread-timeout=true
# 线程队列数量
spring.task.execution.pool.queue-capacity=100
# 线程关闭等待
spring.task.execution.shutdown.await-termination=false
spring.task.execution.shutdown.await-termination-period=
# 线程名称前缀
spring.task.execution.thread-name-prefix=demo_Thread

Borang konfigurasi:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledFuture;
//@Configuration
public class ThreadConfig {
    @Value("${task.maxPoolSize}")
    private int maxPoolSize;
    //todo 其他的相关配置都可以通过配置文件中注入
    @Bean("ThreadPoolTaskExecutor")
    public Executor myAsync() {
        final ThreadPoolTaskExecutor executor =
                new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        //todo  其他参数设置
        //初始化
        executor.initialize();
        return executor;
    }
}

3 Selepas mencipta benang, semua kumpulan benang diperolehi daripada proses kolam Thread 🜎 :

(1) Semak sama ada kumpulan utas teras penuh Jika tidak, buat utas untuk melaksanakan tugasan Jika bilangan utas teras penuh, semak sama ada baris gilir tugasan baris gilir tugasan Jika baris gilir tugasan penuh, semak urutan maksimum Jika bilangannya tidak berpuas hati, buat urutan untuk melaksanakan tugasan Jika sudah penuh, jalankan mengikut dasar penolakan

(2) Dasar penolakan.

    CallerRunSpolicy (): pelaksanaan thread asal
  • AbortPolicy (): Buang pengecualian secara langsung
  • discardPolicy (): Buang secara langsung

  • discardoldestpolicy (): Buang tugas tertua dalam barisan

  • 2: ThreadPoolTaskScheduler

  • 1 ThreadPoolTaskScheduler kerap menjadualkan kumpulan utas tugas untuk memproses tugas tak segerak

2 Penggunaan: Inject ThreadPoolTaskScheduler bean

.

format kelas

rreeee

3 Gunakan tugasan berjadual ThreadPoolTaskScheduler


untuk melakukan penggunaan kumpulan benang biasa:

serahkan(boleh dipanggil), perlu melaksanakan keputusan

  • serah(boleh dijalankan), tiada keputusan pelaksanaan diperlukan

  • ) Berjadual
  • Tambah kandungan tugasan Boleh Dijalankan, tetapkan kitaran pelaksanaan Pencetus/Tarikh, Ekspresi Pencetus Baidu boleh

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.ConcurrentMap;
    import java.util.concurrent.ScheduledFuture;
    @Configuration
    public class ThreadPoolTaskSchedulerConfig {
        @Bean
        public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
            final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
            //设置等待任务在关机时l候完成
            threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
            //设置等待时间为60s
            threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
            return threadPoolTaskScheduler;
        }
    }
  • (2) Tentukan selang Masa untuk melaksanakan tugasan, selang masa adalah dari selesainya tugasan sebelumnya hingga permulaan tugasan seterusnya , dalam milisaat
 schedule(Runnable task,Trigger)
 schedule(Runnable task,Date)

(3) Laksanakan tugasan pada kekerapan tetap, laksanakan tugasan baharu pada selang masa selepas tugasan bermula, jika tugasan terakhir selesai, kemudian tunggu tugasan seterusnya dilaksanakan selepas pelaksanaan tugas terakhir selesai

 scheduleWithFixedDelay(Runnable task,long delay)

(4) Pembatalan tugas berjadual:

Tetapkan koleksi untuk storan tugas berjadual Hasil pelaksanaan tugas berjadual ialah ScheduledFuture6b3d0130bba23ae47fe2b8e8cddf0195, dan simpan objek dalam koleksi , batalkan tugasan dijadualkan dengan mendapatkan ScheduledFutured3d9b9f783327ed2591f7765666b0b22 object.cancel(true) dalam koleksi

 scheduleAtFixedRate(Runnable task,long delay)

Three @Scheduled melaksanakan tugasan yang dijadualkan, dan menganotasi tugasan yang dijadualkan

1 Gunakan @EnableScheduled untuk mendayakan sokongan

2 @Scheduled annotation method

(fixedDelay=5000) pelaksanaan tertunda, dilaksanakan selepas 5s

(2) @Scheduled(fixedRate=5000) pelaksanaan berjadual, dilaksanakan setiap lima saat

(3) @Scheduled(corn="002* *?") Pelaksanaan ungkapan tersuai, corn Baidu, kaedah pelaksanaan ini biasa digunakan, corn="002**?"Mula melaksanakan tugas berjadual pada pukul dua pagi setiap hari

3 Ambil perhatian bahawa tugasan yang dimulakan oleh @Scheduled adalah satu benang, Penyekatan mudah

(1) Suntikan ThreadPoolTaskScheduler ke dalam ioc, kemudian Scheduled akan menggunakan kumpulan benang ThreadPoolTaskScheduler, yang boleh menyelesaikan masalah penyekatan satu benang
(2) @Scheduled dan @Async anotasi mendayakan tugas berjadual, dinyatakan dalam @Async("pool") Kumpulan utas, jika tiada kumpulan utas yang ditentukan, kumpulan utas SimpleAsyncTaskExecutor Spring akan digunakan Kumpulan utas ini akan menambah utas untuk melaksanakan tugas setiap kali, yang tidak cekap 4: Tugasan tak segerak dalam Spring

1 @EnableAsync dihidupkan. sokongan tak segerak

2 @Async mendayakan tugas tak segerak dan menentukan kumpulan utas

Nota: Anotasi @Scheduled dan @Async mendayakan tugas berjadual dan nyatakan kumpulan utas dalam @Async("pool" Jika kumpulan benang tidak ditentukan, Spring's Kumpulan utas SimpleAsyncTaskExecutor akan digunakan Ini Kumpulan utas akan menambah utas untuk melaksanakan tugasan setiap kali, yang tidak cekap Walau bagaimanapun, jika @Async menghidupkan tugas tak segerak secara berasingan, kumpulan utas lalai akan digunakan sesuaikan kumpulan benang mengikut keperluan Nota: Nilai pulangan @Async hanya boleh terbatal atau Masa Depan, pemanggil dan @Async tidak boleh berada dalam kelas yang sama, jika tidak aop tidak akan digunakan

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.*;
@Service
public class SchedulerService {
    @Autowired
    ThreadPoolTaskScheduler scheduler;
    /**
     * 常规线程池使用
     */
    public void tesScheduler1() throws ExecutionException, InterruptedException {
        //无返回值
        final Future<?> demo_scheduler1 = scheduler.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("demo runnable scheduler");
            }
        });
        //无返回值
        final Future<?> demo_scheduler2 = scheduler.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                System.out.println("demo callable  scheduler");
                return "callable";
            }
        });
        System.out.println("result:" + demo_scheduler2.get());
    }
    /**
     * 定时任务
     */
    public void tesScheduler2() throws ParseException {
        //CronTrigger表达式百度即可
        scheduler.schedule(() -> {
            System.out.println("定时任务");
        }, new CronTrigger("0/1****?"));
        //创建指定时间的日期
        final Date date = new Date(2023, 3, 26, 21, 35);
        final DateFormat format = new SimpleDateFormat();
        final Date parse = format.parse("2023-03-26-21-26");
        scheduler.schedule(() -> {
            System.out.println(new Date());
        }, parse);
    }
    /**
     * 指定时间间隔执行任务,上次任务结束到下次任务开始的时间间隔
     */
    public void tesScheduler3() {
        scheduler.scheduleWithFixedDelay(() -> {
            //todo
        }, 300L);
    }
    /**
     * 固定频率执行任务,在固定一段时间后便会执行下次任务,
     * 如果时间到了上次任务还没执行完毕则等待,
     * 直到上一次任务执行完毕后立马执行下次任务
     */
    public void tesScheduler4() {
        scheduler.scheduleAtFixedRate(new FutureTask<String>(new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        return null;
                    }
                }),
                200);
    }
    //取消定时任务队列
    public static ConcurrentMap<String, ScheduledFuture> map = new ConcurrentHashMap<>();
    public void startTask(String k1) {
        map.compute(k1, (k, v) -> {
            if (map.containsKey(k)) return v;
            map.put(k, v);
            return v;
        });
    }
}

Lima: Hadir a kumpulan benang java tersuai:

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncService {
    @Async
    public void showThreadName1() {
        //默认线程池
        System.out.println(Thread.currentThread().getName());
    }
    @Async("myPool")//指定线程池
    public void showThreadName2() {
        System.out.println(Thread.currentThread().getName());
    }
}

kumpulan benang java sendiri, cache, nombor tetap ,benang tunggal, bermasa,,,, enam atau tujuh jenis, akan diteruskan kemudian

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan kumpulan benang Springboot sendiri. 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