[英]Why doesn't my Thread create a new one when it catches an Exception?
所以我有一個像這樣運行的線程:
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("redo groupMonitor ... ");
if (redogmSafer < 1) {
groupMonitor.run(remoteHost, port);
} else {
}
redogmSafer = 100;
}
};
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnable, 0, delayStart, TimeUnit.MILLISECONDS);
if (redogmSafer < 1) {
} else {
service.shutdown();
service.shutdownNow();
redogmSafer = 0;
}
我想再次run()
Thread
,在它因異常或其他原因退出后(發生所有 4-5 小時)。
我曾嘗試shutdown()
和shutdownNow()
,但這也無濟於事。 就像 Java 不想在線程啟動和關閉后重做線程......
您可以像這樣創建一個新線程:
Thread newThread = new Thread(runnable);
newThread.start();
或使用 ExecutorService:
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(runnable);
但是您已經在使用應該完成這項工作的 ScheduledExecutorService。
Runnable
/ Callable
代碼 ScheduledExecutorService
在接收到Throwable
( Exception
或Error
)時會停止進一步的調度。 這種停止是無聲的,沒有錯誤報告,也沒有消息或日志記錄。
因此,您應該着眼於預防問題而不是解決問題。 預防措施是用 try-catch 包裝您的Runnable
/ Callable
代碼。
只要沒有Throwable
冒泡調用堆棧到達調度的執行器服務,調度就會繼續。
Runnable runnable = new Runnable() {
@Override
public void run() {
try{
System.out.println("redo groupMonitor ... ");
if (redogmSafer < 1) {
groupMonitor.run(remoteHost, port);
} else {
…
}
redogmSafer = 100;
} catch ( Exception e ) { … }
}
};
是否捕獲Throwable
、 Exception
或一些更具體的異常取決於您和您的團隊根據您的情況來決定。
這個話題已經在 Stack Overflow 上討論過多次。 搜索以了解更多信息。 具體來說,請參閱ScheduledExecutorService 異常處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.