将来の呼び出し可能なモード

  スレッド方法:
                1. Threadクラスの継承は、
                Runnableを実装2.
                3.スレッドプール
                4.Callableを

  関係なく継承Threadクラスのか、Runnableインタフェースを実装するか、スレッドプールは二つの問題を解決する方法はありません使用し
                、実行の1スレッドが結果値を返しません
                2.スレッドの実行が例外をスローする方法はありません、唯一の自分ののtry-catchを通じて解決することができます

 

  呼び出し可能とRunnableを。同様に、JUCパッケージで、主な違いの嘘は、メソッド呼び出しに呼び出し可能にすることができる値を返すと、例外をスローすることができ
       、所望の呼び出し可能な戻り値の結果を受信することができる、将来の実装クラスをサポートする必要を実行した場合、将来の実装クラスは、FutureTaskあります

 

  実装の呼び出し可能な最初の呼び出し:

                パブリック クラス MyCallableが実装呼び出し可能の<string> { 
                    @Override 
                    パブリック文字列()の呼び出しがスロー例外{ 
                        (System.out.printlnは「戻り値があってもよい、方法の書き換えインターフェースコール呼び出し可能にし、例外をスロー」);
                         戻り「呼び出し可能」; 
                    } 

                    公共の 静的な 無効メイン(文字列[]引数)がスローExecutionException、InterruptedExceptionある{ 
                        MyCallable myCallable = 新しい新しいMyCallableを();
                         //呼び出し可能な利用FutureTaskの実行とは、結果を受け入れる 
                        FutureTask <文字列> = stringFutureTask 新しい新しい FutureTask <> ;(myCallable)
                         // タスクを実行するためにスレッドを使用するタスク
                        新しい新しいスレッド(stringFutureTask).startを();
                         // FutureTask.get詰まりが発生した結果受け入れる
                        システムを.out.println(stringFutureTask.get()); 

                        のSystem.out.println( "完成MyCallableは、〜を正しく受信した結果の値を返します" ); 
                    } 
                }

 

         二コール呼び出し可能な実装:

                パブリック 静的 ボイドメイン(文字列[]引数)がスローExecutionException、InterruptedExceptionある{ 
                    MyCallable myCallable = 新しい新しいMyCallableを();
                     // スレッドプール作成 
                    ExecutorServiceのExecutorServiceの= Executors.newFixedThreadPool(3 );
                     // タスクを実行するスレッドを作成し、タスク結果、所与の 
                    未来<文字列>フューチャー= ExecutorService.submit(myCallable);
                     //は、戻り値を受け入れる 
                    のSystem.out.println(Future.get(2000年、TimeUnit.MILLISECONDSを)); 
                    System.out.printlnは(:「モード2スレッドプールはMyCallable完成し、〜結果の値が正しく受信返す」);
                     // 停止スレッドプール
                    executorService.shutdownを(); 
                }

 

            メソッドは戻り、一時的にブロックされた状態ならば場合、タスクの実行の結果を得るためにFuture.get()メソッド
            Future.get(ロングタイムアウト、TimeUnitでTIMEUNIT)がタイムアウト設定されていないことができ
            、それは正常の終了であるか否かを、糸端場合Future.boolean isDone()をまたはタスクの終了はtrueを返します
            タスクは、それがtrueを返した場合に完了する前にFuture.boolean isCanceller()が解除され
            、着信パラメータは、割り込みタスクの真の代表者であれば、タスクが中断さが成功であれば、(ブールフラグ)メソッドキャンセルFuture.boolean、戻り値はtrueですそれが失敗した場合、偽

 

   未来の3つの機能を提供します:1つの割り込みタスクがキャンセル(真)2.タスクがisDone(完了したか否かを判断する)3.結果は、(タスクの実行をゲット)

// 割り込みタスクは
                、ブールキャンセル= Future.cancel(真の);
                 IF (キャンセル){ 
                    System.out.printlnは( "成功し、割り込みタスク〜" ); 
                } {
                     //は、戻り値を受け入れる 
                    のSystem.out.println(future.getを(2000 、TimeUnit.MILLISECONDS)); 

                }

 

手書きした場合の将来のモデルがどのように定義するためにすべきですか?

待って閉塞を担当し、通知責任を想起したスレッドをブロック

                パブリック クラスMyFuture {
                     // 識別データにFLAGの対応、trueに成功し、リターンへのデータの場合、falseにそう戻っ
                    プライベート 静的 ブール FLAG = falseに;
                     プライベート文字列データ; 

                    公共 同期 無効にsetData(文字列データ)をスロー例外:InterruptedException { 
                        スレッド.sleep( 2000 );
                         // 代入
                        この .dataの= ;データ
                        FLAG = trueに;
                         // 喚起
                        通知()。
                    } 

                    公共 同期文字列のgetData(){
                         // 如果获取数据失败
                        場合(!FLAG){
                             試み{ 
                                待機を(); 
                            } キャッチ(InterruptedExceptionある電子){ 
                                e.printStackTrace(); 
                            } 
                        } 
                        戻り値のデータ、
                    } 

                    パブリック 静的 ボイドメイン(文字列[]引数){ 
                        MyFuture未来 =新しいMyFuture();
                        新しいスレッド(() - > {
                             試み{ 
                                future.setData( "张三" ); 
                                System.out.printlnは(future.getData()); 
                            } キャッチ(例外:InterruptedException e)の{ 
                                e.printStackTrace(); 
                            } 
                        })。開始(); 
                    } 
                }

 

おすすめ

転載: www.cnblogs.com/chx9832/p/12551536.html