2012-02-13 4 views
3

にキャンセル(true)を呼びますか?done()メソッドでコードを実行するカスタムクラスMyFutureTask extends FutureTask<Void>があります。私は<?>または自分のFutureTask

私はsubmit(new MyFutureTask())と呼ぶExecutorServiceを使用します。

送信を呼び出した後に返されるFuture<?>への参照を保持することができますが、キャンセルを呼び出すと、isCancelled()メソッドはtrueを返すことはありません。

返されるFuture<?>オブジェクトを無視して、代わりにMyFutureTaskを使用し、その代わりにcancel(true)を呼び出してください。

Future<?>オブジェクトの使用はどうなりますか?

編集:What's the difference between Future and FutureTask in Java?このスレッドからは分かりません。

デフォルトのキャンセル動作以外にも、私はFutureTaskを使用する予定のルートが正しいと推測するために、進行中のネットワークコールを停止しようとします。誰かが確認できますか?

答えて

0

Executor.submitを使用しないでください。すでに未来があるので、Executor.executeを使用してください。 submitを呼び出すと、あなたはFutureTaskをFutureTaskに別のので不必要にラップするだけです。

+0

ああ、意味があるので、私は正しいことを心配すべきではありません。オブジェクトが返されました。そして、私自身のFutureTaskオブジェクトを使って取り消すことができます。 – dnkoutso

+0

@dnkoutso - はい、それは完全に余計なものです(あなたが見たように誤解を招いています)。 – jtahlborn

0

また、ネットワークトリップを「停止」することはできません。あなたはそれが戻るかタイムアウトするまで待たなければなりません。あなたがやっていることはFuture.cancel(true)を呼び出し、その後あなたのネットワークトリップが見えるときにFuture.isCancelled()がキャンセルされたかどうかを確認することです。あなたは、将来あなたがやっていたことをやめることができます。すべての目的と目的で、ネットワーク旅行をキャンセルできるのと同じ効果です。エンドユーザ(クライアントコードまたは呼び出し元)には、同じ方法で表示されます。あなたが気付くかもしれない唯一の副作用は、あなたが次のタスクを拾う前にネットワークトリップで待っているスレッドが戻らなければならない場合にタスクを実行する単一のスレッドしかなければならない場合です。スレッドプールを使用している場合は問題です。

NIOやその一部のライブラリを使用している場合は、すぐに結果を待つのをやめても問題ありませんが、コードを書くのにはもっと多くの作業が必要です。

+0

実際、Futureのタスクで使用中のソケットへの参照があれば、カスタムの 'cancel()'メソッドの実装で 'close()'を呼び出すことができました。 (これは、カスタムFutureTask implを書く正当な理由になります)。 – jtahlborn

+0

私はビットマップダウンローダでそのことを行っています。ここでは、進行中にダウンロードをカットします。私はそれが進行中のダウンロードを停止することが保証されていないことを知っている、なぜ私はまたdone()メソッドのisCancelled()フラグをチェックしているのですか... – dnkoutso

+0

@chubbardあなたの応答も良いです。彼が最初にやって来た原因。本当にありがとうございました。 – dnkoutso