JavaTM 2 Platform
Standard Ed. 6

java.util.concurrent
類別 ExecutorCompletionService<V>

java.lang.Object
  繼承者 java.util.concurrent.ExecutorCompletionService<V>
所有已實作的介面:
CompletionService<V>

public class ExecutorCompletionService<V>
extends Object
implements CompletionService<V>

使用提供的 Executor 來執行任務的 CompletionService。此類別將安排那些完成時提交的任務,把它們放置在可使用 take 存取的佇列上。該類別非常輕便,適合於在執行幾組任務時臨時使用。

用法範例。 假定您有針對某個問題的一組求解程序,每個求解程序都能返回某種型別的 Result 值,並且您想同時運行它們,使用方法 use(Result r) 處理返回非 null 值的每個求解程序的返回結果。可以這樣編寫程序:

    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);
        }
    }
 
假定您想使用任務集中的第一個非 null 結果,而忽略任何遇到異常的任務,並且在第一個任務就緒時取消其他所有任務:
    void solve(Executor e, Collection<Callable<Result>> solvers) 
      throws InterruptedException {
        CompletionService<Result> ecs = new ExecutorCompletionService<Result>(e);
        int n = solvers.size();
        List<Future<Result>> futures = new ArrayList<Future<Result>>(n);
        Result result = null;
        try {
            for (Callable<Result> s : solvers)
                futures.add(ecs.submit(s));
            for (int i = 0; i < n; ++i) {
                try {
                    Result r = ecs.take().get();
                    if (r != null) {
                        result = r;
                        break;
                    }
                } catch(ExecutionException ignore) {}
            }
        }
        finally {
            for (Future<Result> f : futures)
                f.cancel(true);
        }

        if (result != null)
            use(result);
    }
 


建構子摘要
ExecutorCompletionService(Executor executor)
          使用為執行基本任務而提供的執行程序創建一個 ExecutorCompletionService,並將 LinkedBlockingQueue 作為完成佇列。
ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
          使用為執行基本任務而提供的執行程序創建一個 ExecutorCompletionService,並將所提供的佇列作為其完成佇列。
 
方法摘要
 Future<V> poll()
          獲取並移除表示下一個已完成任務的 Future,如果不存在這樣的任務,則返回 null
 Future<V> poll(long timeout, TimeUnit unit)
          獲取並移除表示下一個已完成任務的 Future,如果目前不存在這樣的任務,則將等待指定的時間(如果有必要)。
 Future<V> submit(Callable<V> task)
          提交要執行的值返回任務,並返回表示掛起的任務結果的 Future。
 Future<V> submit(Runnable task, V result)
          提交要執行的 Runnable 任務,並返回一個表示任務完成的 Future,可以提取或輪詢此任務。
 Future<V> take()
          獲取並移除表示下一個已完成任務的 Future,如果目前不存在這樣的任務,則等待。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

建構子詳細資訊

ExecutorCompletionService

public ExecutorCompletionService(Executor executor)
使用為執行基本任務而提供的執行程序創建一個 ExecutorCompletionService,並將 LinkedBlockingQueue 作為完成佇列。

參數:
executor - 要使用的執行程序
拋出:
NullPointerException - 如果執行程序為 null

ExecutorCompletionService

public ExecutorCompletionService(Executor executor,
                                 BlockingQueue<Future<V>> completionQueue)
使用為執行基本任務而提供的執行程序創建一個 ExecutorCompletionService,並將所提供的佇列作為其完成佇列。

參數:
executor - 要使用的執行程序
completionQueue - 用作完成佇列的佇列,通常是專供此服務使用的佇列
拋出:
NullPointerException - 如果執行程序或 completionQueue 為 null
方法詳細資訊

submit

public Future<V> submit(Callable<V> task)
從介面 CompletionService 複製的描述
提交要執行的值返回任務,並返回表示掛起的任務結果的 Future。在完成時,可能會提取或輪詢此任務。

指定者:
介面 CompletionService<V> 中的 submit
參數:
task - 要提交的任務
返回:
一個表示掛起的任務完成的 Future

submit

public Future<V> submit(Runnable task,
                        V result)
從介面 CompletionService 複製的描述
提交要執行的 Runnable 任務,並返回一個表示任務完成的 Future,可以提取或輪詢此任務。

指定者:
介面 CompletionService<V> 中的 submit
參數:
task - 要提交的任務
result - 要返回的已成功完成任務的結果
返回:
一個表示掛起的任務完成的 Future,其 get() 方法將返回完成時給出的結果值

take

public Future<V> take()
               throws InterruptedException
從介面 CompletionService 複製的描述
獲取並移除表示下一個已完成任務的 Future,如果目前不存在這樣的任務,則等待。

指定者:
介面 CompletionService<V> 中的 take
返回:
表示下一個已完成任務的 Future
拋出:
InterruptedException - 如果在等待時被中斷

poll

public Future<V> poll()
從介面 CompletionService 複製的描述
獲取並移除表示下一個已完成任務的 Future,如果不存在這樣的任務,則返回 null

指定者:
介面 CompletionService<V> 中的 poll
返回:
表示下一個已完成任務的 Future;如果不存在這樣的任務,則返回 null

poll

public Future<V> poll(long timeout,
                      TimeUnit unit)
               throws InterruptedException
從介面 CompletionService 複製的描述
獲取並移除表示下一個已完成任務的 Future,如果目前不存在這樣的任務,則將等待指定的時間(如果有必要)。

指定者:
介面 CompletionService<V> 中的 poll
參數:
timeout - 放棄之前需要等待的時間長度,以 unit 為時間單位
unit - 確定如何解釋 timeout 參數的 TimeUnit
返回:
表示下一個已完成任務的 Future;如果等待了指定時間仍然不存在這樣的任務,則返回 null
拋出:
InterruptedException - 如果在等待時被中斷

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only