この章に関係する内容は次のとおりです。
1。Join()はじめに
2。Join()ソースコード分析(JDK1.7.0_40に基づく)
3。Join()の例
1。Join()はじめに
Join()はthread.javaで定義されています。
Join()の役割:「メインスレッド」が「子スレッド」が終了するのを待ってから、実行を続けます。この文は少しあいまいなかもしれませんが、例を通してそれを理解する必要があります。
コードコピーは次のとおりです。
//メインスレッド
パブリッククラスの父親はスレッドを拡張します{
public void run(){
息子s = new Son();
S.Start();
S.Join();
...
}
}
//チャイルドスレッド
パブリッククラスの息子はスレッドを拡張します{
public void run(){
...
}
}
説明:
上記は、2つのクラスの父(メインスレッドクラス)と息子(サブスレッドクラス)です。息子は父親で作成され始めたため、父はメインスレッドクラスであり、息子はチャイルドスレッドクラスです。
父のメインスレッドで、新しい息子を通して新しい「子スレッド」を作成します。次に、s.start()を介して「子スレッドs」を開始し、S.join()を呼び出します。 S.Join()を呼び出した後、父のメインスレッドは「子スレッドS」が完了するまで待ちます。 これは、「Join()の役割は、メインスレッドに子スレッドが終了し続けることができるようにすることです」と呼んでいます!
2。Join()ソースコード分析(JDK1.7.0_40に基づく)
コードコピーは次のとおりです。
public final void join()throws arturnedexception {
参加(0);
}
パブリックファイナルシンクロナイズドボイド結合(長いミリス)
Strows arturnedexception {
long base = system.currenttimemillis();
長い= 0;
if(millis <0){
新しいIllegalargumentException( "Timeout値は負")を投げます);
}
if(millis == 0){
while(isalive()){
待機(0);
}
} それ以外 {
while(isalive()){
長い遅延=ミリス - 今;
if(delay <= 0){
壊す;
}
待機(遅延);
now = system.currenttimemillis() - base;
}
}
}
説明:
コードから、見つけることができます。当millis==0时,会进入while(isAlive())循环;即只要子线程是活的,主线程就不停的等待。
Join()の役割を説明するときに、上記のコードに基づいてJoin()の使用法を理解しています。
質問:
S.Join()が「父のメインスレッド」で発生する場所は、「子スレッドS」を介してJoin()と呼ばれます。次に、Join()メソッドのiSalive()は、「子スレッド」がAlive Wait(0)が「子スレッドS」待機であるかどうかを決定する必要があります。しかし、もしそうなら、どのようにしてS.Join()の機能は「子スレッドが完了するまでメインスレッドを待つ」ことができるようにする必要があります。オブジェクトSはよく呼ばれます)」?
回答:wait()の関数は、「現在のスレッド」を待機させることであり、ここの「現在のスレッド」は、現在CPUで実行されているスレッドを指します。したがって、子スレッドの待機方法は呼び出されますが、「メインスレッド」を介して呼び出されます。
3。Join()の例
Join()の役割を理解した後、例を使用してJoin()の使用法を確認しましょう。
コードコピーは次のとおりです。
// gointest.javaソースコード
Public Class Jointest {
public static void main(string [] args){
試す {
Threada T1 = new Streada( "T1");
t1.start();
t1.join();
system.out.printf( "%s finish/n"、thread.currentthread()。getname());
} catch(arternedexception e){
e.printstacktrace();
}
}
静的クラススレッドはスレッドを拡張します{
public threada(string name){
super(name);
}
public void run(){
system.out.printf( "%s start/n"、this.getname());
//操作を遅らせます
for(int i = 0; i <1000000; i ++)
;
System.out.printf( "%s finish/n"、this.getName());
}
}
}
実行結果:
コードコピーは次のとおりです。
T1スタート
T1仕上げ
メインフィニッシュ
結果説明:
動作プロセスを図に示します
(01)新しいスレッド(「T1」)を介して「メインスレッドメイン」に新しい「スレッドT1」を作成します。 次に、t1.start()を介して「スレッドT1」を開始し、t1.join()を実行します。
(02)T1.join()を実行した後、「メインスレッドメイン」は「ブロッキング状態」に入り、T1の実行の終了を待ちます。 「子スレッドT1」が完了すると、「メインスレッドメイン」が目覚め、「メインスレッド」がCPUの実行権を取り戻し、実行し続けます。