A.呼び出し可能インターフェースを通じてマルチスレッド
C。呼び出し可能なコールメソッドをオーバーライド実装
コーラブルを達成するために、同様のRunnableをを達成、しかし、より強力な、特定のパフォーマンス
。タスクの終了後に戻り値を提供することができる、Runnableをしませ
b.callメソッドが例外、Runnableのrunメソッドをスローすることがありますいいえ
Cません。あなたはFultureを通じて実行されているメソッド呼び出し呼び出し対象のスレッドが呼び出し可能で、取得戻り値を取得するには、オブジェクト(戻り値に到達するまでfulture.get()、呼び出しをブロックします)の結果を監視することができます
1.Callableインターフェイス説明:
(1)java.util.concurrent.Callableは、汎用インターフェースは、一つだけ()メソッドの呼び出しであります
(2)呼び出し()メソッドは例外例外例外をスローし、指定されたジェネリッククラスオブジェクトを返します
2.Callableインタフェース、マルチスレッドアプリケーションのシナリオ
(1)あなたは親スレッド実行中のスレッドの果実を取得したいとき
ステップ3.呼び出し可能インターフェース、マルチスレッド
(1)最初のステップは:オブジェクト呼び出し可能なサブクラスのインスタンスを作成します
(2)ステップ2:FutureTaskオブジェクトとコンストラクタのFutureTaskに渡されたCallableオブジェクトを作成します。
(注:FutureTaskは、Runnableインタフェースと今後のインターフェイスを実装)
(3)第3ステップ:スレッドオブジェクトとして、オブジェクトコンストラクタFurureTaskを渡します
(4)第四工程:スレッドを開始
実施例1(呼び出し可能インタフェースのスレッドを使用して)。
呼び出し可能インターフェースを使用して、子スレッドクラスを作成します。
パッケージcom.my.frame。 輸入java.util.concurrent.Callable。 パブリック クラス ThreadCallが実装呼び出し可能<ストリング> { @Override パブリック文字列()の呼び出しがスロー例外{ // TODO自動生成方法スタブ のSystem.out.println(「=====を」)。 リターン "9999" ; } }
パッケージcom.my.frame。 輸入java.util.concurrent.FutureTask。 パブリック クラスTestThread { 公共 静的 ボイドメイン(文字列[]引数){ FutureTaskの<string> FT = 新しい FutureTask <>(新しいThreadCall())。 新しいスレッド(フィート).start(); } }
例2(匿名クラスのカテゴリは、子スレッドを作成するための呼び出し可能インターフェースを実装します):
匿名クラスのカテゴリは、子スレッドのクラスを作成し、実装するための呼び出し可能インターフェースを実装します。
パッケージの呼び出し; 輸入java.util.concurrent.Callable。 輸入java.util.concurrent.ExecutionException。 輸入java.util.concurrent.FutureTask。 // 匿名类部类实现呼び出し可能接口创建子线程 パブリック クラスAnonyCallable { 公共 静的 ボイドメイン(文字列[]引数){ 呼び出し可能の<string> CL = 新しい呼び出し可能の<string> (){ @Override パブリック文字列()の呼び出しがスロー例外{ のSystem.out.println(にThread.currentThread()のgetName() + "正在行军~~~" )。 System.out.println(にThread.currentThread()のgetName()。 + "出会いの敵~~~" ); 。System.out.printlnは(にThread.currentThread()のgetName() +「勇敢に敵と戦っ!!!! " ); 戻り "バトル勝利は、50,000敵を捕獲" ; } }; FutureTask、 <文字列> FT = 新しい新しいFutureTask、(CL); 新しい新。スレッド(フィート、"力による形質転換」).start(); 試み{ にThread.currentThread ().setName( "Cunxu力" ); のThread.sleep( 3000 ); System.out.printlnは(。にThread.currentThread()のgetName() + "休息3000ms" ); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } のSystem.out.println(にThread.currentThread()のgetName() + "再編成が...優しいメッセージを待って、終了した" ); 試み{ 文字列STR = ft.get( ); System.out.printlnは( "Cunxu友軍メッセージ:" + STR); } キャッチ(例外:InterruptedException | ExecutionException E){ e.printStackTrace(); } } }