[マルチスレッド]-結合メソッドの使用に関する詳細な説明

I.はじめに

慣例に従って、知識ポイントについて話す前に、理解を助けるためにビジネスシナリオアプリケーションを習慣的に提案します。今日は、スカムバッグケースを介した参加の関連する特性について話します。

土木工学の3番目のクラスのチェンは有名なスカムバッグです。最近、チェンはガールフレンドと別れました。彼は開いた窓の中にいて、WeChatの近くの人々を開いて、かっこいいと思った女の子を選びました。リクエストをしました。会話を始める。

public class ChatUp {
    
    
	// 被搭讪人是否回复
	public volatile static boolean flag = false;
	// 微信昵称
	public static String userName = "土木三班陈同学";

	public static void main(String[] args) throws InterruptedException {
    
    
		// 这天陈同学闲得无聊 打开附近的人进行搭讪
		Thread thread = new Thread(() -> {
    
    
			try {
    
    

				String msg = Thread.currentThread().getName() + "同学,你好像我认识的一个人!";
				// 陈同学发起搭讪
				say(userName, msg);
				Thread.sleep(1_000);
				// 蛋蛋同学回复
				say(Thread.currentThread().getName(), "像谁?");
				flag = true;
			} catch (InterruptedException e) {
    
    
			}
		}, "蛋蛋");
		thread.start();
		// 这里小小的休眠下 保证控制台输出顺序
		Thread.sleep(5l);
		// 判断是否回复了陈同学
		if (flag) {
    
    
			say(userName, "我的心上人!");
		} else {
    
    
			System.err.println("陈同学没有等到回复,于是就去睡觉了!");
		}

	}

	/**
	 * @value user 谈话发起方
	 * @value msg 谈话内容
	 */
	public static void say(String user, String msg) {
    
    
		System.out.println(user + " : " + msg);
	}

}

ここでは、プログラムの実行結果を確認します。
ここに画像の説明を挿入

会話を始めるタスクを完了するために新しいスレッドスレッドを作成したため、Chenはこのタスクの結果が戻るのを待たずに眠りに落ち、良い結婚を逃しました。これは明らかに機能していないため、最適化する必要があります。上記のプログラムは、Chenに取得させるためのものです。スレッドは、スリープ状態になるように応答します。では、どのようにそれを達成する必要がありますか?これが、今日お話しするナレッジポイントの参加です。

2、結合メソッド

1.Apiへの参加の概要

新しい方法を学ぶには、公式文書を比較する方が明確でなければなりません。
ここに画像の説明を挿入
実際、ここでの結合方法の説明は、次の2つのポイントにのみ要約できます。

  1. joinメソッドが呼び出された後、現在のスレッドはターゲットfutureが終了するのを待ってから、実行を続行します
  2. join()メソッドを直接呼び出すことは、join(0)を呼び出すことと同じです

ここでは、結合現象を観察するために、上記のデモに少し変更を加えます。

public class ChatUp {
    
    
	// 被搭讪人是否回复
	public volatile static boolean flag = false;
	// 微信昵称
	public static String userName = "土木三班陈同学";

	public static void main(String[] args) throws InterruptedException {
    
    
		// 这天陈同学闲得无聊 打开附近的人进行搭讪
		Thread thread = new Thread(() -> {
    
    
			try {
    
    

				String msg = Thread.currentThread().getName() + "同学,你好像我认识的一个人!";
				// 陈同学发起搭讪
				say(userName, msg);
				Thread.sleep(1_000);
				// 蛋蛋同学回复
				say(Thread.currentThread().getName(), "像谁?");
				flag = true;
				System.err.println(Thread.currentThread().getName()+"线程已经执行完毕");
			} catch (InterruptedException e) {
    
    
			}
		}, "蛋蛋");
		thread.start();
		thread.join();
		// 这里小小的休眠下 保证控制台输出顺序
		Thread.sleep(5l);
		// 判断是否回复了陈同学
		if (flag) {
    
    
			say(userName, "我的心上人!");
		} else {
    
    
			System.err.println("陈同学没有等到回复,于是就去睡觉了!");
		}
			System.err.println(Thread.currentThread().getName()+"线程已经执行完毕");

	}

	/**
	 * @value user 谈话发起方
	 * @value msg 谈话内容
	 */
	public static void say(String user, String msg) {
    
    
		System.out.println(user + " : " + msg);
	}
}

結果を観察します。
ここに画像の説明を挿入
ここでは、メインスレッドがeggスレッドの実行を待機し、eggスレッドによって変更されたフラグパラメーターの最新値を取得していることがわかります。joinメソッドを呼び出すと、現在のスレッドがターゲットスレッドの終了を待ってから続行できることが証明されています。

2.結合メソッドの実装

結合メソッドの実装原理を理解するには、結合に対応するソースコードを開く必要があります。
ここに画像の説明を挿入
ここでは、結合メソッドの基本的な実装が実際には非常に単純であることに気づき、嬉しい驚きを感じています。スレッドは、waitメソッドのパラメーター形式を呼び出すことで待機できます。もちろん、彼は待機によって実装されているため、次の特性も持っていることを意味します。

1. waitメソッドを呼び出すと、現在のスレッドが保持しているロックがすぐに解放されます。2。joinを呼び出した
後、スレッドが待機状態にある場合、interruptメソッドを呼び出すと、現在のスレッドがinterruptExceptionをスローします。

3.まとめ

結合方式は、主に現在のスレッドがターゲットスレッドの実行結果に依存する場合に使用されます。呼び出し直後にロックを解除する機能があります。もう1つ注意点があります。待機を呼び出すかどうか疑問に思う人も多いでしょう。一時停止を実現するための下部のメソッドが、ウェイクアップするためにnotifyメソッドを呼び出す他のスレッドが見つかりませんでした。実際、この時点でJDKのソースコードを開くことができます。
ここに画像の説明を挿入
スレッドが終了すると、スレッドはexitメソッドを呼び出して終了し、exitメソッドは内部のensure_joinメソッドを呼び出し、ensure_joinを呼び出します。メソッドはlockを呼び出します。notify_all(thread)は、現在待機中のスレッドをウェイクアップします。

これまでのところ、今日のコンテンツはすべて終わり、お気に入りの友達はワンクリックで3つの接続を確立できます!
Sanlianの友達が昇進して、彼らの給料を人生の頂点に引き上げることができたらいいのにと思います。

おすすめ

転載: blog.csdn.net/xiaoai1994/article/details/110817636