簡體   English   中英

Java線程停止工作,並且沒有拋出異常或Throwable

[英]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-BreakCtrl-\\機制-請參閱對掛起或循環進程進行故障排除 ,這將導致HotSpot VM打印線程轉儲,包括線程狀態。

問題只是使DeadLock尖叫起來 -它顯示了一個的所有經典症狀。

死鎖是指線程A等待線程B完成並釋放一些資源(鎖),而線程B等待線程A完成並釋放一些資源。
有關死鎖的更多信息可以在Java教程中找到

這導致兩個線程都停止執行,什么也沒有等待。

在某些情況下,即使程序使用旨在檢測死鎖的程序來查找程序是否確實存在死鎖,也可能會非常棘手,該程序的使用可能會暫時“解決問題”。 有關更多詳細信息,請參見Heisenbug

有時(盡管並非總是),檢測死鎖的最佳方法是查看程序的抽象,並嘗試檢查線程之間的所有依賴關系-並查看在依賴關系中可能發生的沖突。

PS另一個常見的同步問題是數據競賽

首先,我將研究ExecutorService並將您的代碼分解為一個Callable。 這將允許您在具有返回值或讓異常增加的能力的線程中運行它。 然后,如果出現問題,您可以重新啟動它。

每當代碼捕獲Exception和/或Throwable時,它就會發出很大的代碼氣味。 除已檢查的異常外,任何異常都應拋出。 如果您使用如上所述的可調用模式,則可以檢查所獲取的內容,將其記錄下來,然后重新啟動(如有必要)。

暫無
暫無

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

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