簡體   English   中英

ExecutorService.submit(Runnable task,T result)中的'result'是什么做的?

[英]What does 'result' in ExecutorService.submit(Runnable task, T result) do?

看看javadocs,它只是說

<T> Future<T> submit(Runnable task, T result)

提交Runnable任務以執行並返回表示該任務的Future。 Future的get方法將在成功完成后返回給定的結果。

參數:

任務 - 要提交的任務

結果 - 返回的結果

但它對結果有什么影響? 它存儲了什么嗎? 它只是使用結果類型來指定Future<T>的類型嗎?

它對結果沒有任何作用 - 只是持有它。 任務成功完成后,調用future.get()將返回您傳入的結果。

以下是Executors $ RunnableAdapter的源代碼,它顯示在任務運行后,返回原始結果:

static final class RunnableAdapter<T> implements Callable<T> {
    final Runnable task;
    final T result;
    RunnableAdapter(Runnable  task, T result) {
        this.task = task;
        this.result = result;
    }
    public T call() {
        task.run();
        return result;
    }
}

是的,結果的泛型類型應該與返回的Future的類型相匹配。

Runnable不返回任何內容,Future必須返回一些內容,因此此方法允許您預定義返回的未來的結果。

如果你不想返回一個東西,你可以返回null,我認為Void類型存在來表達那種東西。

Future<Void> myFuture = executor.submit(myTask, null);

你知道myFuture.get()在這種情況下會返回null ,但只有在任務運行之后才會返回null ,所以你會用它來等待並拋出任務中拋出的任何異常。

try {
  myFuture.get();
  // After task is executed successfully
  ...
} catch (ExecutionException e) {
  Throwable c = e.getCause();
  log.error("Something happened running task", c);
  // After task is aborted by exception
  ...
}

您可以改變在任務期間傳入的對象。 例如:

final String[] mutable = new String[1];
Runnable r = new Runnable() {
    public void run() {
        mutable[0] = "howdy";
    }
};
Future<String[]> f = executorService.submit(r, mutable);
String[] result = f.get();
System.out.println("result[0]: " + result[0]);

當我運行此代碼時,它輸出:

result[0]: howdy

暫無
暫無

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

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