Java マルチスレッド: スレッドが特定の順序で実行されるようにする
序文
Java のマルチスレッドがよく使われますが、マルチスレッドを実行する場合、特定の実行順序を確保する必要がある場合が多く、そうしないと、エラーや予期しない結果が発生する可能性があります。
この記事では、Thread.join() を使用して複数のスレッドを順次実行する方法を紹介します。
1. Thread.join() の紹介
Join メソッドの本質は、Object で wait() メソッドを呼び出してスレッドのブロックを実現することです。
メイン関数: メイン スレッドは、子スレッドの終了を待ちます。つまり、メイン スレッドのコード ブロックで t.join() メソッドが検出された場合、メイン スレッドは待機 (ブロック) し、子スレッドが終了するのを待機する必要があります (このスレッドが終了するのを待機します。 ) t の実行を続行する前の join() の後のコード ブロック。
wait メソッドを呼び出すにはロックを取得する必要があるため、join メソッドは synchronized によって変更されます。これは、メソッド レベルでの synchronized(this) と同等であり、これは現在のスレッドのインスタンスです。
Thread.join() ソースコード:
public final synchronized void join(long millis) throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
//判断是否携带阻塞的超时时间,等于0表示没有设置超时时间
if (millis == 0) {
//isAlive获取线程状态,无线程等待直到 join 的线程结束
while (isAlive()) {
//调用Object中的wait方法实现线程的阻塞
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
詳細については、次のリンクを参照してください。
Thread.join() Explains
Thread 3: Using of Thread Join()
二、解決策
特定のソリューションのコード例を参照してください。
public class JoinTest {
// 1.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行
public static void main(String[] args) {
final Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("t1");
}
});
final Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
// 引用t1线程,等待t1线程执行完
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2");
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try {
// 引用t2线程,等待t2线程执行完
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t3");
}
});
t3.start();//这里三个线程的启动顺序可以任意,都可以按照t1,t2,t3的顺序执行,大家可以试下!
t2.start();
t1.start();
}
}
要約する
Java でスレッドが特定の順序で実行されるようにするには、Thread.join() を使用できます。学習するときは、最初に join() メソッドの意味を理解する必要があります。
米国にとって良いことを願っています!