Java多线程——如何控制线程顺序执行,如何控制线程同时执行

在这里插入图片描述

引出

Java多线程——如何控制线程顺序执行,如何控制线程同时执行


如何控制线程执行顺序?

问题:现在有 T1、T2、T3 三个线程,你怎样保证 执行顺序是t3—> t2 —> t1 ?

public class App8 {
   
    public static void main(String[] args) throws Exception {
   
        Thread t1 = new Thread(() -> {
   
            System.out.println("执行t1");
        }, "t1");
        Thread t2 = new Thread(() -> {
   
            System.out.println("执行t2");
        }, "t2");
        Thread t3 = new Thread(() -> {
   
            System.out.println("执行t3");
        }, "t3");
        t3.start();
        //t.join()方法只会使主线程(或者说调用t.join()的线程)进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。
        t3.join();
        t2.start();
        t2.join();
        t1.start();
        t1.join();
    }
}

多个线程在某一时刻同时开始执行?

countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。 倒计时闭锁。

CountDownLatch 是 Java 标准库中提供的一个同步工具类,用于在多线程编程中协调多个线程的执行顺序。它的作用是允许一个或多个线程等待其他线程完成操作后再继续执行,用于控制线程之间的同步。

CountDownLatch 的核心思想是:一个线程(或多个线程)等待其他线程完成某个操作后,再继续执行。

  • CountDownLatch
    • 1、作用: 主要用于控制一个或多个线程等待其他线程完成一组操作,然后再继续执行
    • 2、await()方法则使调用该方法的线程处于等待状态,一般是主线程调用。
    • 3、countDown()方法每次都会使计数器减一,减为0时处于阻塞等待的主线程将会被唤醒。
public class App9 {
   
    /**
     * CountDownLatch
     * 1、作用: 主要用于控制一个或多个线程等待其他线程完成一组操作,然后再继续执行
     * 2、await()方法则使调用该方法的线程处于等待状态,一般是主线程调用。
     * 3、countDown()方法每次都会使计数器减一,减为0时处于阻塞等待的主线程将会被唤醒。
     * 需求:三局对战都胜利,才胜利
     */
    public static void main(String[] args) throws InterruptedException {
   
        String[] country = {
   "对战1","对战2","对战3"};
        CountDownLatch countDownLatch = new CountDownLatch(3);
        for (int i = 0; i < 3; i++) {
   
            new Thread(()->{
   
                // 执行任务
                System.out.println(Thread.currentThread().getName() + "执行完毕");
                // 任务完成,减少计数
                countDownLatch.countDown();
            },country[i]).start();
        }
        // 等待所有任务完成
        countDownLatch.await();
        System.out.println("取得胜利!!!");
    }
}

创建线程有几种方式?

方式1:继承Thread创建线程

public class MyThread extends Thread {
   
    @Override
    public void run() {
   
        for (int i = 0; i < 20; i++) {
   
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
    public static void main(String[] args) {
   
        MyThread t1 = new MyThread();
        t1.start();
        MyThread t2 = new MyThread();
        t2.start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arya's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值