我第一次在 spring boot webapp 中使用執行緒,當我進行除錯時,我看到執行緒名稱在增加,如 Thread-1、Thread-2... 對于每個呼叫方法,所以我認為程式不會殺死執行緒,但是為每次呼叫創建新執行緒。
這是我的代碼:
public Advert saveAdvert(Advert advert) {
Advert advertToSave = advertRepository.save(advert);
new Thread(() -> {
try {
populateAdvertSearch(advertToSave);
} catch (ParseException e) {
e.printStackTrace();
} catch (OfficeNotFoundException e) {
e.printStackTrace();
} catch (OfficePropertyNotFoundException e) {
e.printStackTrace();
}
}).start();
return advertToSave;
}
這populateAdvertSearch()是一個無效的方法。我只想獨立于主執行緒執行該任務,因為它很長而且我不希望客戶端等待整個方法,因此另一個獨立執行緒將執行此 void 方法。但正如我所說,我認為該程式并沒有殺死執行緒。我怎樣才能殺死執行緒或者我應該顯式殺死(我不確定它是否在執行完成后已經被殺死但是為什么Intellij IDEA除錯顯示執行緒名稱增加)
uj5u.com熱心網友回復:
在執行緒啟動和run()方法回傳后,這Thread將終止并最終被垃圾收集。您會看到遞增的 ID 號,因為您正在為每個此類操作啟動新執行緒。因此不需要顯式終止。
uj5u.com熱心網友回復:
利用@Async
在 Web 應用程式中,手動創建執行緒不是正確的方法。這個程序是constful的,最好維護一個Pool of Threads。
由于您使用的是 Spring Boot,因此您需要的一切都是使用注釋配置類,@EnableAsync并將ThreadPoolTaskExecutor在后臺為您配置。您可以通過application.properties(例如,指定所需的最小/最大池大小)對其進行自定義。
并告訴某個方法應該在不同的執行緒中執行,您需要@Async在其上放置注釋(請注意,此方法應駐留在由 Spring 管理的類中,即使用構造型注釋之一進行注釋 @Component,@Controller等等)。
@Async
public Advert saveAdvert(Advert advert) {
Advert advertToSave = advertRepository.save(advert);
try {
populateAdvertSearch(advertToSave);
} catch (ParseException e) {
e.printStackTrace();
} catch (OfficeNotFoundException e) {
e.printStackTrace();
} catch (OfficePropertyNotFoundException e) {
e.printStackTrace();
}
return advertToSave;
}
uj5u.com熱心網友回復:
好吧,從外部終止正在運行的執行緒不是一個好主意,但如果您愿意,可以使用ExecutorService.
假設您想在 5 秒后終止特定執行緒;
if (executor.awaitTermination(5, TimeUnit.SECONDS)) {
// continue
} else {
// force shutdown
executor.shutdownNow();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/536397.html
