2012-07-25 61 views
0

我對我的代碼有疑問。在java中獲得線程例外

我有兩個線程從主要方法運行&我想捕捉在主要方法中的任何兩個線程中可能發生的異常。

Future<Object> incoming=Executors.newSingleThreadExecutor().submit(new Task1(param1)); 
Future<Object> outgoing=Executors.newSingleThreadExecutor().submit(new Task2(param2)); 

問題是,如果我使用Future對象&調用get()方法爲例外,它會阻止我的代碼&我不知道,如果說線程2已完成線程之前/拋出異常1.

我如何處理這個優雅而不是這個?

while(!(incoming.isDone() || outgoing.isDone())){} 
+1

對於初學者來說,不會產生這樣的遺囑執行人的服務。這是一個重量級的對象,你創建一次,存儲在一個安全的地方,並在完成後關閉。你的代碼是一個明確的線程泄漏。 – 2012-07-25 13:31:29

+0

在'run'方法中捕獲異常並將其記錄下來。 – 2012-07-25 13:31:38

回答

0

如何:

一個隊列中的所有線程之間共享(確保是線程安全的!),

Queue<Throwable> exceptionsToProcess; 

然後,鎖定你的主要方法有一個while循環:

//start threads, pass them the queue 


while(true) 
{ 
    Throwable t; 
    while((t = exceptionsToProcess.poll()) == null); 
    //process t 
} 

異常將以正確的順序處理,雖然您運行的併發風險ModificationException如果你不關心線程安全性。

編輯:這可能是用於此目的的有用隊列類:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/LinkedBlockingQueue.html

2

我會異步處理異常,如果你想要處理一旦它發生,而不是等待任何其他任務完成。

ExecutorService oneService = ... 

oneService.submit(new Runnable() { 
    public void run() { 
     try { 
      new Task(param1).run(); 
     } catch(Exception e) { 
      // handle exception asynchronously 
     } 
    }   
});