三つの方法JAVAマルチスレッド、マルチスレッドの実装の値を返す方法

値を返すことができたタスクは、呼び出し可能インターフェースが似て実装しなければならない、と何の戻り値のタスクは、Runnableインタフェースである必要があります。呼び出し可能なタスクを実行したら、結果のマルチスレッドを返されてきた伝説を達成することができ、スレッドプールのExecutorServiceのインターフェイスと組み合わせるあなたがオブジェクト呼び出し可能なタスクのリターンを得ることができるオブジェクト、上で取得呼び出し、Futureオブジェクトを取得することができます。以下は、完全なマルチスレッドテストケースが返された結果を提供します

 

JAVAマルチスレッドの実装3つがあります、Runnableインタフェースを実装継承Threadクラス、ExecutorServiceの、呼び出し可能な、将来を使用し実現していますが、マルチスレッドの結果を返します。最後のものだけが戻り値であるとの最初の二つの方法とは、スレッドが、戻り値の実装後ではありません。

 

図1は、継承Threadクラスは、マルチスレッド実装
Iマルチスレッド実装として分類だけでなく、スレッドの性質にスレッドのインスタンスを表し、Runnableインタフェースのインスタンスを実装していても継承Threadクラスメソッド、およびスレッド開始唯一の方法は、経由Threadクラスのインスタンスの()メソッドを起動することです。開始()メソッドは、新しいスレッドを開始します、ネイティブメソッドで、run()メソッドを実行します。これは直接スレッドを拡張し、そのクラスを介して、マルチスレッド達成するための非常に単純な方法であり、複製のrun()メソッドは、新しいスレッドを開始し、run()メソッドを自分で定義を実行することができます。例えば:

{公共MyThreadスレッドクラス延び
  公共ボイドRUN(){
   ;のSystem.out.println(「MyThread.run()」)
  }
}
次のように適切な場所でスレッドを開始
;)(=新しい新規MyThread MyThread myThread1
MyThreadをMyThread =新しい新しいmyThread2 ();
myThread1.start();
myThread2.start()。

2、Runnableをマルチスレッドの方法を実装する
それらのクラスが既に別のクラスを拡張する場合、直接スレッドを拡張することができない次のように、時間は、、、Runnableインタフェースを実装する必要があります:
パブリッククラスはMyThread OtherClassを拡張器具をRunnableを{
  公共ボイドRUN(){
   ; System.out.printlnは(「MyThread.run()」)
  }
}
:myThreadを開始するために、あなたがスレッドをインスタンス化し、そのmyThreadの例を渡す必要があります
)新しい新しいmyThread myThread =を(myThread;
スレッドは=新しい新しいスレッドスレッド( myThread);
Thread.start();
実際には、Runnableをターゲットスレッドにパラメータを渡した後、スレッドのrun()メソッドは、(target.runと呼ばれている)、ソースJDKを参照してください
ます。public void実行(){
  のiF (!ターゲット= NULL){
   target.run();
  }
}

3、ExecutorServiceの、呼び出し可能を使用して、今後は、マルチスレッドの結果のリターンを実現している
ExecutorServiceの、呼び出し可能に、このオブジェクトの将来の機能は、実際にクラスエグゼキュータ・フレームワークに属しています。フレームの顔は非常に詳細な説明がなされhttp://www.javaeye.com/topic/366591にアクセスすることができますエグゼキュータのフレームワークについての詳細をお知りになりたいです。戻り値の結果は、私は苦労し、戻り値とを取得するためにする必要はありませんこの機能は、確かに、非常に実用的なJDK1.5で導入された新しいスレッド機能であり、それも抜け穴を達成することができます。
値を返すことができたタスクは、呼び出し可能インターフェースが似て実装しなければならない、と何の戻り値のタスクは、Runnableインタフェースである必要があります。呼び出し可能なタスクを実行したら、結果のマルチスレッドを返されてきた伝説を達成することができ、スレッドプールのExecutorServiceのインターフェイスと組み合わせるあなたがオブジェクト呼び出し可能なタスクのリターンを得ることができるオブジェクト、上で取得呼び出し、Futureオブジェクトを取得することができます。ここでは、直接使用することができます何の問題もなかったJDK1.5の下で検証し、マルチスレッドの完全なテスト結果が戻ってきたの例です。コードは以下の通りであります:

* java.util.concurrentのインポート;.
インポートjava.util.Date;
インポートjava.util.Listに、
java.util.ArrayListの輸入;

/ **
スレッドと*戻り値
* /
@SuppressWarnings( "をチェック")
パブリッククラス{試験
(文字列[]引数)パブリック静的ボイド主はExecutionException、スロー
InterruptedExceptionある{
;のSystem.out.println( "プログラムは---- ----実行を開始")
日=新しい新しい日付1日();

INT 5 = taskSize。 ;
//スレッドプールを作成
ExecutorServiceの= Executors.newFixedThreadPoolプール(taskSizeを);
//複数のタスクを作成し、戻り値の持つ
<今後> =新しい新しいリストのArrayList <今後>()のリストを、
(I = 0をint型のために、私は< taskSize; I ++){
呼び出し可能MyCallableは新しい新しいCは、=(私は) "" +;
//取得したタスクや今後のオブジェクト
F = pool.submitフューチャー(C);
//するSystem.out.println( ">>>" + f.get()のtoString());
List.add(F);
}
//近いスレッドプールの
プール。シャットダウン();

//取得し、すべての同時タスクの実行結果
(今後のF:リスト)のための{
//コンソールにFutureオブジェクトの戻り値と出力からタスクを取得
するSystem.out.println(「>>>」+ 。f.get()のtoString());
}

日=新しい新しいDATE2日();
のSystem.out.printlnは( "---- ----プログラムは、実行時間、実行完了["
+(date2.getTime( ) - date1.getTime())+ "MS]");
}
}

クラスMyCallable実装呼び出し可能<OBJECT> {
プライベート文字列taskNum;

MyCallableは、(文字列taskNum){
this.taskNum = taskNum;
}

パブリックオブジェクト呼び出し()は、{例外をスロー
} } コード説明:エグゼキュータクラスコード、作成するスレッドプールファクトリメソッドの最初のシリーズ、リターン上記は、スレッドプールExecutorServiceのインターフェースを実装しています。パブリック静的ExecutorServiceのnewFixedThreadPool(INT nthreadsの値)スレッドの固定された数を生成するスレッドプール。パブリック静的ExecutorServiceのnewCachedThreadPoolは、() スレッドが利用可能な場合)を実行するために、キャッシュされたスレッドプールのスレッドの呼び出しは以前に構築を再利用します作成します。既存のスレッドが使用できない場合は、新しいスレッドが作成され、プールに追加されます。キャッシュから60秒間使用されていないこれらのスレッドを終了し、削除します。パブリック静的ExecutorServiceのnewSingleThreadExecutor()単一スレッドエグゼキュータを作成します。
















public static ScheduledExecutorService newScheduledThreadPool(int型corePoolSize)
定期的かつ定期的なタスクの実行をサポートするために、スレッドプールを作成するには、ほとんどの場合、Timerクラスを置き換えるために使用することができます。

、ExecutoreServiceは()メソッドを提出提供コーラブル、またはRunnableをを渡し、未来を返します。バックグラウンドスレッドプールエグゼキュータが完了コーラブルを計算していない場合、この呼び出しは、計算が完了するまでFutureオブジェクトのget()メソッドはブロックします返します。

参考:マルチスレッドJAVAを達成するには、3つの方法

おすすめ

転載: www.cnblogs.com/aspirant/p/11734406.html