[英]Java thread stops working and no Exception or Throwable is thrown
我通常用大約4個線程運行程序,並且在程序運行一些線程后的1小時到10小時之間的任何時間,它們只是停止並且什么也不做,我的程序圍繞Exception和Throwable塊運行,我也有uncaughtException,因此什么也不做被添加到我的日志文件中有關任何錯誤。 我如何找到導致線程停止的原因?
編輯
這是我的代碼的基本結構
以下是用於設置uncaughtException塊的代碼
newThread.setName("Thread" + totalNumberOfThreads);
newThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
Main.logger.info("ERROR! An exception occurred in " + t.getName() + ". Cause: " + e.getMessage());
}
});
newThread.start();
這是線程的基本結構
@Override
public void run()
{
while (true)
{
try
{
//a long section of code
}
catch (Exception e)
{
e.printStackTrace();
Main.logger.info(threadName + ": " + e);
}
catch (Throwable t)
{
Main.logger.info(threadName + ": " + "Throwable: " + t);
}
finally
{
//some code to close connections.. ect..
}
} // end while
}
我如何找到導致線程停止的原因?
您是否知道線程已停止的事實? 如前所述,它們可能被阻止。 您可以使用jstack
來查看它們是否處於活動狀態,也可以進行仔細檢查以啟用遠程調試功能啟動該程序,並在感覺它們已停止時附加調試器。
您可以嘗試在調試器中運行程序,這將使您檢查線程的狀態。
您還可以使用Java中的內置Ctrl-Break
或Ctrl-\\
機制-請參閱對掛起或循環進程進行故障排除 ,這將導致HotSpot VM打印線程轉儲,包括線程狀態。
問題只是使DeadLock尖叫起來 -它顯示了一個的所有經典症狀。
死鎖是指線程A等待線程B完成並釋放一些資源(鎖),而線程B等待線程A完成並釋放一些資源。
有關死鎖的更多信息可以在Java教程中找到
這導致兩個線程都停止執行,什么也沒有等待。
在某些情況下,即使程序使用旨在檢測死鎖的程序來查找程序是否確實存在死鎖,也可能會非常棘手,該程序的使用可能會暫時“解決問題”。 有關更多詳細信息,請參見Heisenbug 。
有時(盡管並非總是),檢測死鎖的最佳方法是查看程序的抽象,並嘗試檢查線程之間的所有依賴關系-並查看在依賴關系中可能發生的沖突。
PS另一個常見的同步問題是數據競賽
首先,我將研究ExecutorService並將您的代碼分解為一個Callable。 這將允許您在具有返回值或讓異常增加的能力的線程中運行它。 然后,如果出現問題,您可以重新啟動它。
每當代碼捕獲Exception和/或Throwable時,它就會發出很大的代碼氣味。 除已檢查的異常外,任何異常都應拋出。 如果您使用如上所述的可調用模式,則可以檢查所獲取的內容,將其記錄下來,然后重新啟動(如有必要)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.