2015-11-05 59 views
0

我正在嘗試使用線程進行多重計算。 然後,我需要確保所有線程都完成其工作後,對結果進行一些操作。多線程加入並獲取返回值

這裏的基本代碼:

private class Runner implements Runnable { 
     private String _result = "fail"; 

     public String get_results() { 
     return _result; 
     } 

     public void run() { 
     _result = "do complex calculation"; 
     } 
    } 

    public void test() { 
     List<Thread> threads = new ArrayList<Thread>(); 
     List<Runner> threadObjects = new ArrayList<Runner>(); 

     for (int i = 0; i < 10; i++) { 
      Runner runner = new Runner(); 
      Thread t = new Thread(runner); 
      t.start(); 
      threads.add(t); 
      threadObjects.add(runner);     
     } 

     for (Thread thread : threads) { 
      try { 
       thread.join(); 
      } catch (InterruptedException ex) { 
      } 
     } 

     for (Runner threadObject : threadObjects) { 
      System.out.println(threadObject.get_results()); 
     } 

    }  

我的問題是,在上面的代碼中常見的還是不錯的方法來獲得計算的價值? 如果不是,請提出更好的建議。 也有時我得到了runner.get_results()迴應=「失敗」,似乎計算根本沒有處理。

感謝

+3

_Also有時我得到亞軍.get_results()reponse =「fail」_這不應該與您發佈的代碼一致。 –

+3

取決於一點,但尋找'未來'和'執行者'。常見的做法是,你很少看不到直接使用的'Thread'類。 – zapl

+0

您不應該從此代碼獲取'=「失敗」',因爲您在創建的每個線程上都調用了'.join()'。 – 3kings

回答

1

您可以使用ExecutorServiceScheduledThreadPoolExecutor;

ExecutorService executor = new ScheduledThreadPoolExecutor(numOfThreads); 

numOfThreads是你想要坐在線程池中的線程數。

然後,您可以使用ScheduledThreadPoolExecutor類提供的submit(Callable<T> task)方法執行計算。

然後,您將有一個Callable執行您的計算,並將其傳遞給ExecutorService中的submit()方法執行計算;

class Calculation implements Callable { 

    @Override 
    public Object call() throws Exception { // The signature can be changed to return a different type (explained at the end) 
     return "do complex calculation"; 
    } 
} 

我們可以從submit(Callable<T> task)方法返回一個Future的方法簽名看。

public <T> Future<T> submit(Callable<T> task) 

Future類的get()方法將返回成功完成後的結果。這可以確保您的計算在閱讀之前完成。

關於call()方法返回類型的進一步說明;

雖然這個返回Object沒有什麼能阻止你改變對象返回的類型(這被稱爲co-variant returns

例如,以下是完全合法:

@Override 
    public String call() throws Exception { 
     return "do complex calculation"; 
    } 
+0

你能提供簡單的完整的java代碼示例嗎? – Ratha