Heim >Java >javaLernprogramm >So lösen Sie das Problem der geplanten Single-Thread-Ausführung in SpringBoot
Bei der Verwendung geplanter Aufgaben in SpringBoot wurde festgestellt, dass die Ausführung einer bestimmten Aufgabe eine große Menge an Ressourcen beanspruchte, was dazu führte, dass andere Aufgaben nicht ausgeführt werden konnten.
Ähnlich wie im folgenden Simulationsszenario hat die Simulation der geplanten Aufgabe test1 eine Ausführungszeit von fünf Sekunden. Zu diesem Zeitpunkt wirkt sie sich gleichzeitig auf die Ausführung der Aufgabe test2 aus, wodurch auch die Aufgabe test2 alle fünf Sekunden ausgeführt wird.
@Scheduled(fixedRate = 1000) public void test1() throws InterruptedException { log.info(Thread.currentThread().getName() + " | task01 "); Thread.sleep(5000); } @Scheduled(fixedRate = 2000) public void test2() { log.info(Thread.currentThread().getName() + " | task02 "); }
Nach der Überprüfung relevanter Informationen wurde festgestellt, dass die Standardanzahl der Threads für geplante Timing-Aufgaben nur eins beträgt. Bei der Planung geplanter Aufgaben werden diese synchron geplant. Ein weiterer wird ausgeführt. Dies ist die direkte Ursache des Problems.
@Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); // 设置线程数量 taskScheduler.setPoolSize(50); return taskScheduler; }
Fügen Sie eine Konfiguration hinzu und legen Sie die Anzahl der TaskScheduler-Threads auf mehrere fest, sodass sie bei der Ausführung asynchron ausgeführt werden und sich die einzelnen geplanten Aufgaben nicht gegenseitig beeinflussen.
Mit der im folgenden Java-Util-Paket enthaltenen TimerTask können auch geplante Aufgaben ausgeführt werden.
In den folgenden Parametern ist TimerTask die auszuführende Aufgabe. 0 bedeutet, dass die erste Ausführung um 0 Sekunden verzögert wird, und 3000 bedeutet, dass sie alle 3000 Millisekunden ausgeführt wird.
// true表示定时任务创建为守护线程 Timer timer = new Timer(true); //timer.scheduleAtFixedRate(); timer.schedule(new TimerTask() { @Override public void run() { logger.info(Thread.currentThread().getName() + "************"+ftpGaFilePrefix); } }, 0, 3000);
Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der geplanten Single-Thread-Ausführung in SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!