全部。我是 SpringBoot 的新手。現在我希望根據引數命名一個執行緒。
舉個簡單的例子,我目前正在使用@Async符號來創建一個異步方法
@PostMapping
public void requestMethod(@RequestBody String id){
...
asyncMethod(id);
}
@Async
public void asyncMethod(String id){
...
}
一旦有POST請求發送到requestMethod,該方法將在新執行緒中創建一個異步方法。執行緒的名稱與接收到的引數相同id。
因為程式中會有很多異步方法。并且異步方法將在無限回圈中運行。所以,我想根據它們的名字終止執行緒。但我該怎么做呢?
如果有任何歧義,請告訴我。提前致謝。
uj5u.com熱心網友回復:
你不能這樣做。您可以做的最好的事情是在TaskExecutor此處指定和設定執行緒前綴名稱。
@Bean
@Qualifier(SOME_PUBLIC_STATIC_FINAL_VARIABLE)
public Executor myExecutor() {
int corePoolSize = 4, maxPoolSize = 8;
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
log.info("Will use {}/{} thread pool for {}", executor.getCorePoolSize(), executor.getMaxPoolSize(), taskName);
executor.setThreadNamePrefix(ADD_YOUR_PREFIX_HERE);
executor.initialize();
return executor;
}
然后在您的Async注釋上,您指定 Executor,例如@Async(SOME_PUBLIC_STATIC_VARIABLE).
uj5u.com熱心網友回復:
最簡單的方法就是自己設定執行緒名稱
@Async
public void asyncMethod(String id){
Thread.currentThread().setName("thread-" id);
...
}
uj5u.com熱心網友回復:
Aid Hadzic 的回答是正確的,但它還缺少另一件事。在您的自定義 ThreadExecutor 中,您可以設定一個 ThreadFactory。
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadFactory(new ThreadFactory() {
AtomicInteger threadCounter = new AtomicInteger(0);
@Override
public Thread newThread(Runnable r) {
Thread namedThread = new Thread(r);
namedThread.setDaemon(true);
namedThread.setName("my-custom-thread-" threadCounter.incrementAndGet());
return namedThread;
}
});
這將生成具有指定名稱的執行緒,并且隨著您創建更多執行緒,它們的數量甚至會增加。
設定守護執行緒將允許應用程式關閉,即使執行緒仍然處于活動狀態(與不允許應用程式關閉的用戶執行緒相反)。
現在,為了停止特定執行緒,我認為您需要在執行程式之外存盤對創建執行緒的參考并強制停止它們,或者使用 CompleteableFuture 而不是 @Async 注釋,但這超出了這個答案的范圍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/521472.html
