2011-06-21 14 views
1

atm我正在使用內部線程來調用方法。這個方法可以拋出一個異常。有沒有辦法在外部類中接收異常以對其作出反應? 或者我應該寫一個「workthread」並添加一個觀察者?Java是使用內部線程明智嗎?如果是,如何提取異常?

我實現了一個MVC模式。這個方法在我的模型中被調用。現在我想顯示有關異常的消息。所以我需要知道這個例外。

public void startServer(final String path, final int port, final double speedup) { 

    serverIsStopped = false; 

    new Thread() { 

     public void run() { 
      server = new SWTimeServer(); 
      try{ 
       server.startServer(port, speedup, path); 
      }catch (ClientDisconnectedException e) { 
       serverIsStopped = true; 
       //TODO 
      } catch (ParseException e) { 
       serverIsStopped = true;  
       //TODO 
      } 
     } 
    }.start(); 


} 

我想出了這個快速解決方案。但相當醜陋。你的意見?

private boolean serverIsStopped = true; 
private Model model = this; 

public void startServer(final String path, final int port, final double speedup) { 

    serverIsStopped = false; 

    new Thread() { 

     public void run() { 
      server = new SWTimeServer(); 
      try{ 
       server.startServer(port, speedup, path); 
      }catch (ClientDisconnectedException e) { 
       serverIsStopped = true; 
       model.notifyObservers(e); 
      } catch (ParseException e) { 
       serverIsStopped = true;  
       model.notifyObservers(e); 
      } 
     } 
    }.start(); 


} 

感謝答案

問候 Tarken

+0

請給一些背景到您希望使用的「內螺紋」 –

+0

我得到了一個MVC模式來完成什麼,這個代碼是我的模型的一部分。如果拋出異常,我想在我的視圖中顯示消息。我如何獲得例外。這有幫助嗎? – Tarken

回答

1

您不能從線程B收到線程A的異常,並且您通常會使用任何基本的try/catch結構。如果你想要這樣做,你必須實現一些類型的線程間消息傳遞/信號。

除了這個建議之外,如果沒有更完整的解釋,你可能沒有太多的幫助。

3

你的問題就沒有意義了。

您的線程在調用方法(創建線程)完成後運行(大部分)。

將線程中拋出的異常傳播到外部方法是沒有意義的。

0

我沒有用線程做過太多的開發,但是你不能通過存儲異常並加入主線程來對異常做出反應嗎?

public void startServer(final String path, final int port, final double speedup) { 
    serverIsStopped = false; 

    Thread thread = new Thread() { 
     Exception e; 
     public void run() { 
      server = new SWTimeServer(); 
      try{ 
       server.startServer(port, speedup, path); 
      }catch (ClientDisconnectedException e) { 
       serverIsStopped = true; 
       //TODO 
       this.e = e; 
      } catch (ParseException e) { 
       serverIsStopped = true;  
       //TODO 
       this.e = e; 
      } 
     } 
    }.start(); 

    // the main thread will wait here until the new thread terminates 
    thread.join(); 

    if (thread.e != null) { 
     // do stuff 
    } 
} 
+0

這並不能解決我的問題,因爲我仍然無法直接對異常做出反應。 – Tarken

+0

我認爲你需要更好地定義你的意思是什麼「反應[和]直接例外。」在你的心中,你認爲什麼是你正在尋找會是什麼樣子(即使它只是僞代碼)的答案嗎?我認爲其他兩個答案涵蓋了其他可能性。 –

+0

我會嘗試;-)在我的GUI中單擊按鈕後,通過控制器調用此方法。現在,服務器開始做他的東西(將信息推送到客戶端)。如果客戶端斷開,我必須通知用戶關於斷開連接。因此,如果我得到異常,我必須通過通知GUI直接作出反應。這有幫助嗎? – Tarken

0

我會用你自己的建議在這裏應用觀察者/可觀察模式。儘管如此,你必須(鬆散地)將「工作者/執行者」線程對象與觀察者耦合起來,但它會導致更簡潔的代碼,並且可以通過觀察者拋出必要的異常

只有這種方法存在問題,你不知道調用線程處於什麼狀態,因此,如果有任何操作將會/可能從觀察者的異常中取得。儘管如此,如果再次調度,您可以記錄異常(或存儲它)供以後由主線程檢索。

希望這有助於

1

由某些類實現Thread.UncaughtExceptionHandler並將其分配給您的線索,這將讓你收到你的線程拋出的異常。

Thread t = new Thread() { 
    ..... 
}; 

t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    void uncaughtException(Thread t, Throwable e) { 
     // Handle exception 
    } 

}); 

http://download.oracle.com/javase/6/docs/api/java/lang/Thread.UncaughtExceptionHandler.html#uncaughtException(java.lang.Thread,%20java.lang.Throwable

+0

該解決方案類似於編寫我自己的線程並按照我想要的方式處理異常。因爲我需要一個新的類。我試圖避免這種情況。但謝謝你的回答。 – Tarken

相關問題