Heim > Java > javaLernprogramm > So implementieren Sie den eigenen Thread-Pool von Springboot

So implementieren Sie den eigenen Thread-Pool von Springboot

王林
Freigeben: 2023-06-28 16:33:05
nach vorne
947 Leute haben es durchsucht

Eins: ThreadPoolTaskExecutor

1 ThreadPoolTaskExecutor Thread-Pool:

ThreadPoolTaskExecutor ist die sekundäre Kapselung, die auf Javas eigenem Thread-Pool ThreadPoolExecutor basiert. Der Hauptzweck besteht darin, die Verwendung von Thread-Pools im Spring-Framework-System komfortabler zu gestalten Spring Thread-Pool

2 Verwenden Sie ThreadPoolTaskExecutor, um Beans in ioc einzufügen
Konfigurationsdateiformular, Spring konfiguriert automatisch

## 默认线程池配置,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
Nach dem Login kopieren

Konfigurationsformular:

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;
    }
}
Nach dem Login kopieren

3 Nach dem Erstellen von Threads werden alle Thread-Pools von ioc abgerufen

4 Thread-Pool-Verarbeitungsprozess :

(1) Überprüfen Sie, ob der Kern-Thread-Pool voll ist. Wenn die Anzahl der Kern-Threads voll ist, prüfen Sie, ob die Aufgabenwarteschlange voll ist Wenn die Aufgabenwarteschlange voll ist, überprüfen Sie die maximale Anzahl an Threads, um die Aufgabe auszuführen. Wenn sie voll ist, führen Sie sie gemäß der Ablehnungsrichtlinie aus.

    CallerRunsPolicy(): Die ursprüngliche Thread-Ausführung
  • AbortPolicy(): Eine Ausnahme direkt auslösen
  • DiscardPolicy(): Direkt verwerfen
  • DiscardOldestPolicy(): Die älteste Aufgabe in der Warteschlange verwerfen.
  • 2: ThreadPoolTaskScheduler

1 ThreadPoolTaskScheduler regelmäßig Task -Thread -Pools, um asynchrone Aufgaben zu verarbeiten. Verwenden Sie geplante ThreadPoolTaskScheduler-Aufgaben

, um die normale Thread-Pool-Nutzung durchzuführen:

Senden (aufrufbar), das Ergebnis muss ausgeführt werden.

Senden (ausführbar), kein Ausführungsergebnis erforderlich.

  • (1) Geplante Aufgabe

    Aufgabeninhalt hinzufügen Ausführbar, Ausführungszyklus-Auslöser/-Datum festlegen, Auslöseausdruck Baidu kann
  • 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;
        }
    }
    Nach dem Login kopieren
  • (2) Intervall angeben Zeit zum Ausführen einer Aufgabe, das Zeitintervall reicht vom Abschluss der vorherigen Aufgabe bis zum Start der nächsten Aufgabe , in Millisekunden
     schedule(Runnable task,Trigger)
     schedule(Runnable task,Date)
    Nach dem Login kopieren

    (4) Abbruch geplanter Aufgaben:

  • Legen Sie die Sammlung für die Speicherung geplanter Aufgaben fest. Das Ergebnis der geplanten Aufgabenausführung ist ScheduledFuture, und speichern Sie das Objekt in der Sammlung. Brechen Sie die geplante Aufgabe ab, indem Sie ScheduledFuture object.cancel(true) in der Sammlung
 scheduleWithFixedDelay(Runnable task,long delay)
Nach dem Login kopieren

Three @Scheduled implementiert die geplante Aufgabe und kommentiert die geplante Aufgabe

1 Verwenden Sie @EnableScheduled, um die Unterstützung zu aktivieren

2 @Scheduled-Anmerkungsmethode

(1) @Scheduled (fixedDelay=5000) verzögerte Ausführung, nach 5 Sekunden ausgeführt

(2) @Scheduled(fixedRate=5000) geplante Ausführung, alle fünf Sekunden ausgeführt

(3) @Scheduled(corn="002* *?") Benutzerdefinierte Ausführung, Maisausdruck Baidu, diese Ausführungsmethode wird häufig verwendet, corn="002**?"Beginnen Sie jeden Tag um zwei Uhr morgens mit der Ausführung geplanter Aufgaben

3 Beachten Sie, dass es sich bei den von @Scheduled gestarteten Aufgaben um Single-Threaded-Aufgaben handelt, die leicht zu blockieren sind

(1) ThreadPoolTaskScheduler in ioc einfügen, dann verwendet Scheduled den Thread-Pool ThreadPoolTaskScheduler, der das Single-Thread-Blockierungsproblem lösen kann

(2) @Scheduled- und @Async-Annotationen ermöglichen geplante Aufgaben, angegeben in @Async("pool") Thread-Pool: Wenn kein Thread-Pool angegeben ist, wird der Thread-Pool SimpleAsyncTaskExecutor von Spring verwendet. Dieser Thread-Pool fügt jedes Mal einen Thread zum Ausführen der Aufgabe hinzu, was ineffizient ist. 4: Asynchrone Aufgaben in Spring

1 @EnableAsync asynchrone Unterstützung

2 @Async ermöglicht asynchrone Aufgaben und gibt den Thread-Pool an

Hinweis: @Scheduled- und @Async-Annotationen ermöglichen geplante Aufgaben und geben den Thread-Pool in @Async("pool") an. Wenn der Thread-Pool nicht angegeben ist, wird Spring's verwendet Der Thread-Pool SimpleAsyncTaskExecutor fügt jedes Mal einen Thread hinzu, um die Aufgabe auszuführen. Wenn @Async die asynchrone Aufgabe jedoch separat aktiviert, wird empfohlen Passen Sie den Thread-Pool entsprechend den Anforderungen an. Hinweis: Der Rückgabewert von @Async kann nur void oder Future sein, der Aufrufer und @Async dürfen nicht in derselben Klasse sein, andernfalls wird aop nicht verwendet Benutzerdefinierter Java-Thread-Pool:

 scheduleAtFixedRate(Runnable task,long delay)
Nach dem Login kopieren

Java-eigener Thread-Pool, Cache, feste Nummer, Single-Threaded, zeitgesteuert,,,, sechs oder sieben Typen, Fortsetzung folgt später

Das obige ist der detaillierte Inhalt vonSo implementieren Sie den eigenen Thread-Pool von Springboot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage