首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java如何保证线程T1,T2,T3 顺序执行?

Java如何保证线程T1,T2,T3 顺序执行?

作者头像
IT_陈寒
发布2025-06-01 13:19:55
发布2025-06-01 13:19:55
24900
代码可运行
举报
文章被收录于专栏:开发经验开发经验
运行总次数:0
代码可运行

在 Java 中,要确保线程 T1、T2 和 T3 顺序执行,可以使用多种方式。这里介绍几种常见的方案:

方案 1:使用 Thread.join()

Thread.join() 是最简单直接的方法。调用某个线程的 join() 方法时,当前线程会等待该线程执行完毕后再继续执行。

代码示例:

代码语言:javascript
代码运行次数:0
运行
复制
public class ThreadSequence {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            System.out.println("Thread T1 is running.");
        });

        Thread t2 = new Thread(() -> {
            System.out.println("Thread T2 is running.");
        });

        Thread t3 = new Thread(() -> {
            System.out.println("Thread T3 is running.");
        });

        try {
            t1.start();
            t1.join(); // 等待 t1 结束
            t2.start();
            t2.join(); // 等待 t2 结束
            t3.start();
            t3.join(); // 等待 t3 结束
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在这种方式中,主线程依次启动并等待 T1、T2 和 T3 执行完毕,确保了线程顺序执行。

方案 2:使用 LockCondition

通过 ReentrantLockCondition,我们可以更灵活地控制线程的执行顺序。Condition 提供了 await()signal() 方法,可以实现线程之间的精确控制。

代码示例:

代码语言:javascript
代码运行次数:0
运行
复制
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadSequenceLock {
    private static Lock lock = new ReentrantLock();
    private static Condition conditionT2 = lock.newCondition();
    private static Condition conditionT3 = lock.newCondition();
    private static boolean t1Finished = false;
    private static boolean t2Finished = false;

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread T1 is running.");
                t1Finished = true;
                conditionT2.signal(); // 通知 T2 开始
            } finally {
                lock.unlock();
            }
        });

        Thread t2 = new Thread(() -> {
            lock.lock();
            try {
                while (!t1Finished) {
                    conditionT2.await(); // 等待 T1 完成
                }
                System.out.println("Thread T2 is running.");
                t2Finished = true;
                conditionT3.signal(); // 通知 T3 开始
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        });

        Thread t3 = new Thread(() -> {
            lock.lock();
            try {
                while (!t2Finished) {
                    conditionT3.await(); // 等待 T2 完成
                }
                System.out.println("Thread T3 is running.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        });

        t1.start();
        t2.start();
        t3.start();
    }
}

在这个示例中,通过 ReentrantLockCondition 来控制 T2 等待 T1 完成,T3 等待 T2 完成,实现线程的顺序执行。

方案 3:使用 CyclicBarrier

CyclicBarrier 允许多个线程在某个点上进行同步。可以通过它来确保线程之间按顺序执行。

代码示例:

代码语言:javascript
代码运行次数:0
运行
复制
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class ThreadSequenceBarrier {
    public static void main(String[] args) {
        CyclicBarrier barrier1 = new CyclicBarrier(2); // 控制 T2 等待 T1
        CyclicBarrier barrier2 = new CyclicBarrier(2); // 控制 T3 等待 T2

        Thread t1 = new Thread(() -> {
            System.out.println("Thread T1 is running.");
            try {
                barrier1.await(); // 让 T2 继续执行
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                barrier1.await(); // 等待 T1 先执行
                System.out.println("Thread T2 is running.");
                barrier2.await(); // 让 T3 继续执行
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        });

        Thread t3 = new Thread(() -> {
            try {
                barrier2.await(); // 等待 T2 先执行
                System.out.println("Thread T3 is running.");
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        });

        t1.start();
        t2.start();
        t3.start();
    }
}

在此方案中,CyclicBarrier 用于确保线程在特定的同步点等待其他线程达到,从而实现线程按顺序执行。

方案 4:使用 Semaphore

Semaphore 信号量可以控制多个线程对共享资源的访问权限。通过设置初始许可数量,我们可以用它来控制线程的执行顺序。

代码示例:

代码语言:javascript
代码运行次数:0
运行
复制
import java.util.concurrent.Semaphore;

public class ThreadSequenceSemaphore {
    public static void main(String[] args) {
        Semaphore semaphoreT1 = new Semaphore(1); // 控制 T1 的执行
        Semaphore semaphoreT2 = new Semaphore(0); // 控制 T2 的执行
        Semaphore semaphoreT3 = new Semaphore(0); // 控制 T3 的执行

        Thread t1 = new Thread(() -> {
            try {
                semaphoreT1.acquire(); // 先获取许可
                System.out.println("Thread T1 is running.");
                semaphoreT2.release(); // 释放 T2 的许可
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                semaphoreT2.acquire(); // 等待 T1 释放许可
                System.out.println("Thread T2 is running.");
                semaphoreT3.release(); // 释放 T3 的许可
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread t3 = new Thread(() -> {
            try {
                semaphoreT3.acquire(); // 等待 T2 释放许可
                System.out.println("Thread T3 is running.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        t1.start();
        t2.start();
        t3.start();
    }
}

在这个例子中,信号量控制线程执行的先后顺序,确保 T1 先执行,T2 再执行,最后 T3 执行。

总结

为了确保线程 T1、T2 和 T3 按顺序执行,常用的方法包括使用 Thread.join()LockConditionCyclicBarrier 以及 Semaphore。选择哪种方案取决于具体的应用场景和需求:

  • 如果简单且直接,Thread.join() 是最合适的。
  • 如果需要更复杂的线程控制,可以考虑 LockConditionCyclicBarrierSemaphore 等同步工具。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方案 1:使用 Thread.join()
  • 方案 2:使用 Lock 和 Condition
  • 方案 3:使用 CyclicBarrier
  • 方案 4:使用 Semaphore
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档