java多线程之join与yield的区别

文章介绍了Java中`join`和`yield`在多线程编程中的作用,`join`用于让一个线程等待另一个线程完成,`yield`则允许当前线程让出CPU控制权。这两个方法对于控制线程执行顺序和优化性能至关重要。
摘要由CSDN通过智能技术生成

一、join

在线程t2的代码中加入t1.join(),就是让t1这个线程先运行完,让t2这个线程暂时挂起不运行

public static void main(String[] args) {
    Thread t1 = new Thread(() -> {
        System.out.println("线程1开始运行!");
        for (int i = 0; i < 50; i++) {
            System.out.println("1打印:"+i);
        }
        System.out.println("线程1结束!");
    });
    Thread t2 = new Thread(() -> {
        System.out.println("线程2开始运行!");
        for (int i = 0; i < 50; i++) {
            System.out.println("2打印:"+i);
            if(i == 10){
                try {
                    System.out.println("线程1加入到此线程!");
                    t1.join();    //在i==10时,让线程1加入,先完成线程1的内容,在继续当前内容
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    t1.start();
    t2.start();
}

运行结果如下:

线程1开始运行!
线程2开始运行!
2打印:0
1打印:0
2打印:1
1打印:1
2打印:2
1打印:2
2打印:3
1打印:3
2打印:4
1打印:4
2打印:5
1打印:5
2打印:6
1打印:6
2打印:7
1打印:7
1打印:8
1打印:9
1打印:10
2打印:8
1打印:11
2打印:9
1打印:12
2打印:10
线程1加入到此线程!
1打印:13
1打印:14
1打印:15
1打印:16
1打印:17
1打印:18
1打印:19
1打印:20
1打印:21
1打印:22
1打印:23
1打印:24
1打印:25
1打印:26
1打印:27
1打印:28
1打印:29
1打印:30
1打印:31
1打印:32
1打印:33
1打印:34
1打印:35
1打印:36
1打印:37
1打印:38
1打印:39
1打印:40
1打印:41
1打印:42
1打印:43
1打印:44
1打印:45
1打印:46
1打印:47
1打印:48
1打印:49
线程1结束!
2打印:11
2打印:12
2打印:13
2打印:14
2打印:15
2打印:16
2打印:17
2打印:18
2打印:19
2打印:20
2打印:21
2打印:22
2打印:23
2打印:24
2打印:25
2打印:26
2打印:27
2打印:28
2打印:29
2打印:30
2打印:31
2打印:32
2打印:33
2打印:34
2打印:35
2打印:36
2打印:37
2打印:38
2打印:39
2打印:40
2打印:41
2打印:42
2打印:43
2打印:44
2打印:45
2打印:46
2打印:47
2打印:48
2打印:49
需要注意的是,在t1未加入到t2的时候,这两个线程是并发执行,而执行到t1.join时,就让t1这个线程先运行完毕,此时只剩t2这个线程,执行完毕,程序结束

二、yield

yield是将当前线程的cpu时间块让给其他线程(注意,虽然这个线程让出了自己的时间块,但是有可能该线程会被再次选中),引用他人博客的解释,就是:让出当前线程CPU的时间片,使当前线程从执行状态变为就绪状态,cpu将会从就绪队列中重新选择一个线程,也就是说,当前线程还是有可能会被再次选择的。

public static void main(String[] args) {
    Thread t1 = new Thread(() -> {
        System.out.println("线程1开始运行!");
        for (int i = 0; i < 50; i++) {
            if(i % 5 == 0) {
                System.out.println("让位!");
                Thread.yield();
            }
            System.out.println("1打印:"+i);
        }
        System.out.println("线程1结束!");
    });
    Thread t2 = new Thread(() -> {
        System.out.println("线程2开始运行!");
        for (int i = 0; i < 50; i++) {
            System.out.println("2打印:"+i);
        }
    });
    t1.start();
    t2.start();
}

输出结果如下:
线程1开始运行!
让位!
线程2开始运行!
1打印:0
1打印:1
1打印:2
1打印:3
1打印:4
让位!
1打印:5
1打印:6
1打印:7
1打印:8
1打印:9
让位!
1打印:10
1打印:11
1打印:12
1打印:13
1打印:14
让位!
1打印:15
1打印:16
2打印:0
2打印:1
2打印:2
2打印:3
2打印:4
1打印:17
2打印:5
1打印:18
2打印:6
1打印:19
让位!
2打印:7
1打印:20
2打印:8
2打印:9
1打印:21
2打印:10
1打印:22
2打印:11
1打印:23
2打印:12
1打印:24
让位!
2打印:13
1打印:25
2打印:14
1打印:26
2打印:15
1打印:27
2打印:16
1打印:28
2打印:17
1打印:29
让位!
2打印:18
1打印:30
2打印:19
1打印:31
1打印:32
2打印:20
1打印:33
2打印:21
1打印:34
让位!
2打印:22
2打印:23
2打印:24
2打印:25
2打印:26
2打印:27
2打印:28
2打印:29
2打印:30
2打印:31
2打印:32
2打印:33
2打印:34
2打印:35
2打印:36
2打印:37
2打印:38
2打印:39
2打印:40
2打印:41
2打印:42
2打印:43
2打印:44
2打印:45
2打印:46
2打印:47
2打印:48
2打印:49
1打印:35
1打印:36
1打印:37
1打印:38
1打印:39
让位!
1打印:40
1打印:41
1打印:42
1打印:43
1打印:44
让位!
1打印:45
1打印:46
1打印:47
1打印:48
1打印:49
线程1结束!

三、总结

join: 挂起当前线程,让t1.join()这个t1线程先运行结束
yield:本来到这个线程执行了,但是执行了Thread.yield(),就让这个占用cpu的线程处于就绪态,让系统重新选择一个线程占用cpu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值