簡體   English   中英

為什么我的線程在捕獲異常時不創建一個新線程?

[英]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。

用 try-catch 包裝您的Runnable / Callable代碼

ScheduledExecutorService在接收到ThrowableExceptionError )時會停止進一步的調度。 這種停止是無聲的,沒有錯誤報告,也沒有消息或日志記錄。

因此,您應該着眼於預防問題而不是解決問題。 預防措施是用 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 ) { … }
                        }
                    };

是否捕獲ThrowableException或一些更具體的異常取決於您和您的團隊根據您的情況來決定。

這個話題已經在 Stack Overflow 上討論過多次。 搜索以了解更多信息。 具體來說,請參閱ScheduledExecutorService 異常處理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM