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