4

java.util.concurrency を使用して「ファイア アンド フォーゲット」動作を実装するにはどうすればよいですか? 私は試した:

ExecutorService executor = Executors.newSingleThreadExecutor();

public void push(Callable<Boolean> task) {
    Future<Boolean> future = executor.submit(task);
    future.get(timeout, timeoutUnit);
}

しかし、get()は完了するまでブロックされています。push()呼び出し元は、タスクの結果には関心がありません。

4

2 に答える 2

13

電話しないでくださいget()。で を開始するにsubmit()は十分です。結果を取得する準備ができたら、 を渡して呼び出すことができます (ある場合)。CallableThreadFutureget()

Javadocの状態

実行のために値を返すタスクを送信し、タスクの保留中の結果を表す Future を返します。Future の get メソッドは、正常に完了するとタスクの結果を返します。

タスクの待機をすぐにブロックしたい場合は、result = exec.submit(aCallable).get(); という形式の構造を使用できます。

だから電話しないでくださいget()

于 2013-09-05T18:33:17.530 に答える
3

忘れる必要がある場合は、将来のオブジェクトは必要ありません。つまり、スレッドの将来について気にしないでください。:)

ExecutorService executor = Executors.newSingleThreadExecutor();

public void push(Callable<Boolean> task) {
   executor.submit(task);
}

または、future を後で使用する必要がある場合:-

ExecutorService executor = Executors.newSingleThreadExecutor();

public void push(Callable<Boolean> task) {
   someCollection.add(executor.submit(task)); // use futures later
}

または、将来をまったく取得するつもりがない場合は、Executor から実行して Runnable を渡すだけです。

ExecutorService executor = Executors.newSingleThreadExecutor();

public void push(Runnable task) {
   executor.execute(task);
}

// execute は、例外が発生した場合にデフォルトの例外ハンドラーを呼び出します。これは、submit メソッドで先物を取得しない場合に失われる可能性があります。

于 2013-09-05T21:59:40.370 に答える