簡體   English   中英

在Java中,如何從線程獲取返回值?

[英]In java how can I get a return value from a thread?

以下代碼編譯,但在運行時導致空指針異常。 我最好的猜測是outputInts對每個線程都不“可見”,因此無法寫入。

public class myClass{

ArrayList<int> outputints

public void foo(int start, int end) {
    for (int i = start; i <= end; i++) {
          bar(i);
        }

private void bar(int i) {
    class OneShotTask implements Runnable {
        int i;
        OneShotTask(int j) {
            i = j;
        }
        @Override
        public void run() {
            try {
                    System.out.println(i);
                    outputints.add(i);      //null pointer exception caused here
                }
            } catch (Exception e) {
                System.out.println(e.toString());
            }

        }
    }
    Thread t = new Thread(new OneShotTask(j));
    t.start();
  }

 }

我讀過我應該使用一個可調用對象來實現此目的,但是我不知道該如何實現的。 同樣,諸如java Runnable run()方法之類的示例返回一個值的建議似乎表明,我可以使用callable來運行少數幾個線程,而我可能需要在數千個線程中的某個位置。

我正在尋求幫助,以使上述實施工作正常進行,或者為通俗易懂的術語指南提供指導,說明如何通過可調用方法實現

Brian Goetz寫了一本很棒的書,名為《 Java Concurrency in Practice》,深入探討了這本書。 您應該研究使用完成服務(一種執行程序)。 這是示例Java代碼:

     void solve(Executor e, Collection<Callable<Result>> solvers)
         throws InterruptedException, ExecutionException {
           CompletionService<Result> ecs = new ExecutorCompletionService<Result>(e);
           for (Callable<Result> s : solvers)
             ecs.submit(s);
           int n = solvers.size();
           for (int i = 0; i < n; ++i) {
             Result r = ecs.take().get();
               if (r != null)
                 use(r);
 }
}

您可以使用take()方法從ExecutorCompletionService中檢索完成的Futures。 在FutureTask上調用方法get()以獲取結果。 可以使用泛型對這些類進行參數化,以實現類型安全和更大的代碼靈活性。

ArrayList<Integer> outputints = new ArrayList<Integer>();

您的IDE應該可以避免此類錯誤...

暫無
暫無

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

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