私たちは、すなわち三つの方法、質量参加の方法を実行することを知っています:
- コンストラクタのパラメータの受け渡し
- メンバー変数パラメータの受け渡し
- コールバック関数のパラメータ
スレッドの戻り値をどのように扱いますか?
戻り値のスレッドが痛いポイントです。我々のプログラムのいくつかの実施以来、戻り値は行うにはどのようにこの時、帰国の値を取得する必要があり、子供がタスクを実行するために子スレッドに引き渡したときに実行サブタスクに依存しているのですか?どのような方法は、そのサブタスク実現されている値を返しますか?
:主に3つの種類を達成するための方法
(1)メインスレッド待ち法、我々がターゲット子スレッドが結果を返すまで待つようにメインスレッドのループを作ることができるということを。
見て時間を待たずに、結果何:
それは次のステートメントに結果を返すとき、この結果からは、知っているかもしれない、オリジナルのマルチスレッドこのようによると、私たちは、サブタスクの正確な制御のために待つことができません。言い換えれば、すぐに実行する文を印刷し、この時間値が割り当てられていないために、複数のスレッドを実行するためのstartメソッドを呼び出した後、当社のメインスレッドは、我々は、サブタスクの戻り値を取得することはできません。
次に、どのようにそれのサブスレッドの戻り値に依存していますか?:私たちは次のように、メインスレッドのwaitメソッドを使用することができ
、実装が簡単なメインスレッドのwaitメソッドを、欠点は待つために、独自の円形のロジックを達成するために必要であり、複数の変数を待つようにする場合、コードは非常に肥大化しただろう、とループへの必要性定かではどのくらいの期間、私たちは、正確な制御を達成することはできません。
(2)Threadクラス()ブロック処理された子スレッドを待つために現在のスレッドに参加します。
この方法は、単純に実装するため、メインスレッド・ウエイト・コントロールよりも正確な方法を実現することができますが、欠点は、それが十分に微細な粒子サイズではないということです参加します。
(3)呼び出し可能インタフェースによって:FutureTaskまたはスレッドプールにより取得されました。
最初:取得戻り値FutureTask
MyCallableという名前の新しいクラス呼び出し可能インターフェースを、
package thread;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String>{
@Override
public String call() throws Exception {
String value = "test";
System.out.println("Ready to work");
Thread.currentThread().sleep(5000);
System.out.println("task done");
return value;
}
}
その後、テストクラスを作成します。
第二:スレッドプールを介して取得
スレッドプールの利点は、あなたがこれらの呼び出し可能に私たちを助けることができるように、我々は、呼び出し可能インターフェースを実装し、複数のクラスを提出することができ、結果を処理し、同時にスレッドプールを作成することです実装クラスは、統一された管理を行います。