システム全体のスレッド・プールは、3つのスレッドと関連するインタフェースと、スレッドプールと関連するインターフェースを含みます。
エグゼキュータ
パブリック インターフェース執行{ ボイド(Runnableをコマンド)を実行します。 }
スレッドプールにトップレベルのインタフェースは、唯一の方法があります。タスクのタイプのRunnableを受け付ける方法を実行し、将来のある時点でタスクを実行し、スレッドプールのスレッドを使用してタスクを実行することができる新しいスレッドも可能です。
- これは、送信しない実行することです
- Runnableをパラメータの型が関係しているのではなくインタフェースと今後
未来
Javaの世界における将来のインターフェイスはすべてのトップレベルの非同期インターフェイスの結果を実現するためのプレースホルダであるだけでなく、網状にスレッドプールにも広く使用されています。非同期メソッドは、メソッド呼び出しに関係なくメソッドが終了したか否かを、即座に返され、その方法プレースホルダの結果、将来に必要であり、そして未来非同期メソッドの実行が完了すると終了時に得られた結果は、同様に、非同期キャンセルするかどうかを得ます実行メソッド。
- ブール(ブールmayInterruptIfRunning)をキャンセルタスクが完了したか、何らかの方法でキャンセルすることはできません、falseを返した場合、実行中のタスクをキャンセルしようとします。タスクが実行されている場合は、に基づいて mayInterruptIfRunningの値割り込みタスクかどうかを決定します。実際には、達成するために、割り込みスレッドによるキャンセル、それは適切なサポートを提供するために、スレッドを中断する必要があります。 タスクが正常にキャンセルされた場合、isDone isCancelledはtrueを返します
- VのGET()はInterruptedExceptionある、ExecutionExceptionをスロー;タスクはブロッキングの方法でなければならない検索結果を、完了するまで待ちます
- Vは、(長いタイムアウト、TimeUnitで単位)を取得し、同様の取得が、タイムアウトメカニズムに参加し
- ブールisCancelled();タスクが取り消された場合
- ブールisDone();タスクは、完了完了したタスクは、タスクが完了していない場合でも、isDoneキャンセル真後にも返すものとして理解されるべきではありません
パブリック インターフェース将来<V> { ブール(キャンセルブールmayInterruptIfRunning)を、 ブールisCancelled()。 ブールisDone()。 VのGET()はスロー例外:InterruptedException、ExecutionExceptionを。 VのGET(長いタイムアウト、TimeUnit unit)指定 スローInterruptedExceptionある、ExecutionException、TimeoutExceptionを。 }
Runnableを
古くからの友人、何も言うこと
- Runnableを何ジェネリックません
- runメソッドが値を返さない、また、あなたが同様に合格しなければならない共有変数のスレッドを取得したい場合には、今後の#は結果を得るための方法と同様の結果を得る提供しません
パブリック インターフェイスのRunnable { パブリック 抽象 ボイドラン(); }
呼び出し可能
新しい顔、そしてときに新しいスレッド使用されるのRunnableに似ています
- 呼び出し可能な戻り値
- 呼び出し可能では例外がスローされます
パブリック インターフェイス呼び出し可能<V>は、{ / ** *結果を計算し、またはそうすることができない場合に例外をスローします。 * * @return 計算結果は、 * @throws 結果を計算することができない場合、例外を * / )(Vコールがスロー例外。 }
FutureTask
スレッドプールクラスに実際の使用では、この代わりに将来の間接的呼び出し可能と将来のインターフェースを実現インターフェースのインターフェースを実装するクラスであることに注意。その主な役割
- 将来は、インターフェイスの実装を提供し、その結果をgetメソッドで取得することができ、国民が設定されている割り込みフラグを解除します。メソッドの実装が完了したが戻らなくなるまでとgetメソッドがブロックされています。
- ラップ呼び出し可能とのRunnableタスクオブジェクト(ラップ)、タスクの作業戦略を実行するためにスレッドプールと未来を達成するための直接的なインターフェースが、スレッドプールを提出するには、非同期であり、それは実際の実行方法の前に必要ですので、必ず、未来のインターフェースを使用する必要があります非同期の性質のオブジェクトのためのRunnableとCallableオブジェクトパッケージFutureTask
状態変数
FutureTaskは、仕上げのような変化の多くの実行中に発生が予期せず終了することがありますので、各FutureTaskオブジェクトは、タスクを送信表し、そうでキャンセルしているので、実装プロセスにFutureTask保存された状態変化への状態の必要性。状態への変化は確かにCASになるような状態は、揮発性です。
プライベート 揮発 int型状態。 プライベート 静的 最終 int型 NEW = 0 ; プライベート 静的 最終 int型 = 1を完了しました。 プライベート 静的 最終 int型 NORMAL = 2 ; プライベート 静的 最終 int型 EXCEPTIONAL = 3 ; プライベート 静的 最終 int型 = 4 CANCELED 。 プライベート 静的 最終 int型の中断= 5 ; プライベート 静的 最終 INT INTERRUPTED = 6。
そして、実行は状態FutureTaskの道の大きさを比較することによって決定することができるように、すべての可能な値は、int型であることをこれらの状態。
ミッション
ミッションFutureTask、成果へのタスクの結果。
公共 ボイドラン(){ 場合(!状態= NEW || !UNSAFE.compareAndSwapObject(これ、runnerOffset、 ヌル、にThread.currentThread())) のリターン; 試す{ 呼び出し可能 <V> C = 呼び出し可能。 もし(!C = NULL &&状態== NEW){ Vの結果。 ブールが走りました。 試す{ 結果 = c.callを(); 走った = 真; } キャッチ(ThrowableのEX){ 結果 = NULL ; 走った = 偽; setException(EX); } であれば(RAN) セット(結果)。 } } 最後に{ // 状態はに落ち着くまで、ランナーはnull以外でなければなりません // ()を実行する同時呼び出し防ぐ ランナー= ヌル; // 状態を防ぐためにナリングランナー後に再読み込みする必要があります // 漏洩した割り込み int型 S = 状態。 場合(S> = 中断) handlePossibleCancellationInterrupt(S); } }
FutureTaskは結果を得ます
国家のFutureTaskは、<IF = 完結説明FutureTaskまだ終わっていない、レポートが結果を返す呼び出しelseブロックと待つ、または必要があるスレッドのgetメソッドを呼び出します。
公共 Vのget()はスローInterruptedExceptionある、ExecutionException { INT S = 状態; もし(S <= 補完-----------------) S = awaitDone(偽、0L )。 リターン・レポート(複数可)。 }
同様のスレッドと、ブロックされたスレッドのアイデアAQSブロッキング呼び出しは、メソッドは、キューを維持し、ノードは、スレッドがブロックされたとき、現在のスレッドを駐車待ち行列に加わる作成し得ます。
- 受信タイムアウトが偽=タイミング考慮されていない場合awaitDoneは、基準時間と関連するパラメータにそうあり、取得タイムアウトと多重化されてもよいです。
- awaitDoneは、例外がスローされ、返された場合、スレッドの割り込みフラグが設定されているチェック、中断スレッドはすぐに戻ります場合は、その呼び出しがループのためのコードの最初の部分を反映して、中断します、敏感中断されました。
- 同時にgetメソッドは、保留キューに追加されて呼び出す複数のスレッドがあるかもしれないので、キューに入れられた方法は、CASを使用することで、我々は、並行処理の安全性を検討する必要があります。
プライベート int型 awaitDone(ブール時限、長いnanos値)は スローInterruptedExceptionある{ 最後の 長い締め切り=タイムアウトは?System.nanoTimeの()+ nanos値:0L ; WaitNode Q = NULL ; ブール値は =キューに入れられた偽; 用(;;){ 場合(Thread.interrupted()){ removeWaiter(Q)。 スロー 新しい例外:InterruptedExceptionを(); } INT S = 状態。 もし(S>{)を完了 場合!(Q = ヌル) q.thread = NULL ; リターン秒; } それ以外の 場合(S ==補完-----------------が)// まだタイムアウトすることはできません )(Thread.yieldを。 それ以外の 場合(Q == nullの) Q = 新しいWaitNode(); それ以外の 場合(!キューに入れられた) キューに入れられた = UNSAFE.compareAndSwapObject(これ、waitersOffset q.next = ウェイター、Q)。 他の 場合(タイムアウト){ nanos値 =期限- System.nanoTimeの()。 もし(nanos値<= 0L ){ removeWaiter(Q)。 返しの状態を、 } LockSupport.parkNanos(本、またはnanos)。 } 他 LockSupport.park(本) } }
状態は、> =、説明FutureTask終了、結果を直接返すことができる完成場合。実際に、それはおよそ成果方式強いターンです。
プライベート Vレポート(int型単数または複数)はスローExecutionException { オブジェクトX = 結果を、 もし(S == NORMAL) リターン(V)X。 もし(S> = CANCELED) スロー 新しいCancellationException(); スロー 新しい(x)は(のThrowable)ExecutionExceptionを。 }
ミッションをキャンセル
- まずFutureTaskの状態を変更します。NEW状態に応じする唯一の時間である に変更状態mayInterruptIfRunningの値 中断または キャンセルされました。状態がない場合にはNEW故障やCASは状態がNEW CAS判断されたため、CASは唯一の失敗、falseを返すと状態を修正する間に変更されました。要するにのみFutureTaskのNEW状態を解除することができます。
- CASの成功は状態を変更した後に mayInterruptIfRunningの場合、真のスレッド割り込みフラグに設定されます。this.runner FutureTaskは、現在実行中のスレッド呼び出し可能なタスクを表す属性です。
- コール finishCompletionが待っているタスクのスレッドで取得することにより、すべてのコールを削除します。
パブリック ブール(キャンセルブールmayInterruptIfRunning){ 場合(!(状態== NEW && UNSAFE.compareAndSwapInt(これ、stateOffset、NEW、 mayInterruptIfRunning?:キャンセル))中断) を返す 偽。 試す { // 例外をスロー中断する場合の呼び出しで あれば(mayInterruptIfRunning){ しようと{ スレッドt = ランナー。 もし(T!= nullの) t.interrupt(); } 最後に { // 最終状態 UNSAFE.putOrderedInt(この中断stateOffset)。 } } } 最後に{ finishCompletion()。 } を返す 真。 }