Rumah >Java >javaTutorial >Bagaimana untuk melaksanakan kumpulan benang Springboot sendiri
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.
discardPolicy (): Buang secara langsung
discardoldestpolicy (): Buang tugas tertua dalam barisan
2: ThreadPoolTaskScheduler
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
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; } }
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
(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
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()); } }
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan kumpulan benang Springboot sendiri. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!