シナリオ:3つのスレッドt1、t2、およびt3があります。3つのスレッドt1がt2の実行後に実行され、t3がt2の実行後に実行されることを確認します。
1. join
thread.Joinを使用して、指定したスレッドを現在のスレッドに結合します。交互に実行される2つのスレッドを、順次実行スレッドにマージできます。たとえば、スレッドAのJoin()メソッドがスレッドBで呼び出され、スレッドAが実行を終了するまでスレッドBは実行を継続しません。
t.join(); // joinメソッドを呼び出し、スレッドtが
実行を終了するのを待ちますt.join(1000); // tスレッドを待ちます。待機時間は1000ミリ秒です。
1つ、参加する
package Thread;
/**
* @author Muluo
* @create 2021-03-13 8:13
*/
public class testThreadt1t2t3 {
public static void main(String[] args) {
Thread thread1 = new Thread(new work(null));
Thread thread2 = new Thread(new work(thread1));
Thread thread3 = new Thread(new work(thread2));
thread1.setName("线程一");
thread2.setName("线程二");
thread3.setName("线程三");
thread1.start();
thread2.start();
thread3.start();
}
}
class work implements Runnable {
private Thread thread;
public work(Thread thread) {
this.thread = thread;
}
@Override
public void run() {
if (thread != null) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
} else {
System.out.println(Thread.currentThread().getName());
}
}
}
2、CountDownLatch
CountDownLatch(Latch)は非常に便利なツールクラスであり、特定の条件が成熟した後に実行する1つ以上のスレッドをインターセプトできます。内部にカウンターを提供します。ロックを構築するときにカウンターの初期値を指定する必要があり、カウンターの初期値は0より大きくする必要があります。さらに、カウンターの値を操作するためのcountDownメソッドも提供します。countDownメソッドが呼び出されるたびに、カウンターの値が0に減少するまで、カウンターは1ずつデクリメントされます。 awaitメソッドを呼び出すことによってブロックされたすべてのスレッドがウェイクアップされます。これはCountDownLatchの内部メカニズムであり、非常に単純に見えます。特定の条件に達した後、スレッドの一部をブロックして実行させるだけです。
public class ThreadTest2 {
// T1、T2、T3三个线程顺序执行
public static void main(String[] args) {
CountDownLatch c0 = new CountDownLatch(0); //计数器为0
CountDownLatch c1 = new CountDownLatch(1); //计数器为1
CountDownLatch c2 = new CountDownLatch(1); //计数器为1
Thread t1 = new Thread(new Work(c0, c1));
//c0为0,t1可以执行。t1的计数器减1
Thread t2 = new Thread(new Work(c1, c2));
//t1的计数器为0时,t2才能执行。t2的计数器c2减1
Thread t3 = new Thread(new Work(c2, c2));
//t2的计数器c2为0时,t3才能执行
t1.start();
t2.start();
t3.start();
}
//定义Work线程类,需要传入开始和结束的CountDownLatch参数
static class Work implements Runnable {
CountDownLatch c1;
CountDownLatch c2;
Work(CountDownLatch c1, CountDownLatch c2) {
super();
this.c1 = c1;
this.c2 = c2;
}
public void run() {
try {
c1.await();//前一线程为0才可以执行
System.out.println("thread start:" + Thread.currentThread().getName());
c2.countDown();//本线程计数器减少
} catch (InterruptedException e) {
}
}
}
}