Java マルチスレッド: スレッドが特定の順序で実行されるようにする

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() メソッドの意味を理解する必要があります。

米国にとって良いことを願っています!

おすすめ

転載: blog.csdn.net/qq_46119575/article/details/129444324