Java三个线程按顺序执行
在Java中,线程是用于执行并发任务的基本单位。有时,我们希望三个线程按照特定的顺序执行,这可以通过不同的方法实现。本文将介绍三种常用的方法来实现Java三个线程按顺序执行。
方法一:使用join()方法
join()方法是Thread类的一个成员方法,用于等待该线程终止。通过调用join()方法,我们可以让一个线程等待另一个线程执行完毕后再继续执行。
下面是一个示例代码:
public class ThreadDemo {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable("Thread 1"));
Thread t2 = new Thread(new MyRunnable("Thread 2"));
Thread t3 = new Thread(new MyRunnable("Thread 3"));
try {
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name + " is running");
}
}
}
在上面的示例中,我们创建了三个线程t1、t2和t3,并使用join()方法让它们按顺序执行。首先,我们启动线程t1,并调用t1.join()使得主线程等待t1执行完毕。接着,我们启动线程t2,并调用t2.join()使得主线程等待t2执行完毕。最后,我们启动线程t3,并调用t3.join()使得主线程等待t3执行完毕。这样,三个线程就会按照t1、t2、t3的顺序执行。
方法二:使用CountDownLatch
CountDownLatch是Java.util.concurrent包中提供的一个同步工具类。它可以让一个线程等待其他线程完成后再继续执行。
下面是一个示例代码:
import java.util.concurrent.CountDownLatch;
public class ThreadDemo {
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(3);
Thread t1 = new Thread(new MyRunnable("Thread 1", latch));
Thread t2 = new Thread(new MyRunnable("Thread 2", latch));
Thread t3 = new Thread(new MyRunnable("Thread 3", latch));
t1.start();
t2.start();
t3.start();
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class MyRunnable implements Runnable {
private String name;
private CountDownLatch latch;
public MyRunnable(String name, CountDownLatch latch) {
this.name = name;
this.latch = latch;
}
@Override
public void run() {
System.out.println(name + " is running");
latch.countDown();
}
}
}
在上面的示例中,我们创建了一个CountDownLatch对象,并将其初始化为3。然后,我们创建了三个线程t1、t2和t3,并在每个线程中调用latch.countDown()方法来减少CountDownLatch的计数器。最后,我们调用latch.await()方法使得主线程等待计数器变为0,然后继续执行。这样,三个线程就会按照t1、t2、t3的顺序执行。
方法三:使用Semaphore
Semaphore是Java.util.concurrent包中提供的另一个同步工具类。它可以控制同时访问某个资源的线程数。
下面是一个示例代码:
import java.util.concurrent.Semaphore;
public class ThreadDemo {
public static void main(String[] args) {
Semaphore semaphore1 = new Semaphore(1);
Semaphore semaphore2 = new Semaphore(0);
Semaphore semaphore3 = new Semaphore(0);
Thread t1 = new Thread(new MyRunnable("Thread 1", semaphore1, semaphore2));
Thread t2 = new Thread(new MyRunnable("Thread 2", semaphore2, semaphore3));
Thread t3 = new Thread(new MyRunnable("Thread 3", semaphore3, null));
t1.start();
t2.start();
t3.start();
}
static class MyRunnable implements Runnable {
private String name;
private Semaphore currentSemaphore;
private Semaphore nextSemaphore;
public MyRunnable(String name, Semaphore currentSemaphore, Semaphore nextSemaphore