怎样保证线程的有序执行

文章讲述了如何使用Java的Thread.join()方法来保证任务A、B、C按C->A->B的顺序执行,以及如何通过单线程Executor实现相同效果。作者通过示例展示了线程同步和调度的重要性。
摘要由CSDN通过智能技术生成

面试题:有任务A、任务B和任务C三个任务,怎样保证任务以C、A、B的顺序执行

一 Thread类的join()方法

public static void main(String[] args) {
    Random random = new Random();
    Thread threadC = new Thread(() -> {
        try {
            System.out.println("任务C开始执行...");
            Thread.sleep(random.nextInt(10) * 100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
    Thread threadA = new Thread(() -> {
        try {
            threadC.join();
            System.out.println("任务A开始执行...");
            Thread.sleep(random.nextInt(10) * 100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
    Thread threadB = new Thread(() -> {
        try {
            threadA.join();
            System.out.println("任务B开始执行...");
            Thread.sleep(random.nextInt(10) * 100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
   threadA.start();
   threadB.start();
   threadC.start();
    // 任务C开始执行...
    // 任务A开始执行...
    // 任务B开始执行...
}

join()方法是插队执行方法,调用join()方法的线程在指定的线程对象里面插队执行;

二 singleThreadExecutor

使用只有一个工作线程的线程池,任务会按照提交顺序执行

public static void main(String[] args) {
    Random random = new Random();
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    executorService.execute(() -> {
        System.out.println("任务C开始执行...");
        try {
            // 模拟任务执行耗时
            Thread.sleep(random.nextInt(10) * 100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
    executorService.execute(() -> {
        System.out.println("任务A开始执行...");
        try {
            // 模拟任务执行耗时
            Thread.sleep(random.nextInt(10) * 100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
    executorService.execute(() -> {
        System.out.println("任务B开始执行...");
        try {
            // 模拟任务执行耗时
            Thread.sleep(random.nextInt(10) * 100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
    executorService.shutdown();
    // 任务C开始执行...
    // 任务A开始执行...
    // 任务B开始执行...
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值