多线程

5 线程状态

5.3 线程礼让

package com.duo.state;

//测试礼让线程
public class YieldTest {

    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread(myYield, "a").start();
        new Thread(myYield, "b").start();
    }
}

class MyYield implements Runnable {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "线程开始执行");
        Thread.yield();  //线程礼让
        System.out.println(Thread.currentThread().getName() + "线程停止执行");
    }
}

运行结果

图1

如上所示,原本a线程应当会相继输出“a线程开始执行”和”a线程停止执行”,由于线程礼让,在执行完System.out.println(Thread.currentThread().getName() + "线程开始执行");之后,a线程礼让,b线程开启;同理,在b线程执行完相同语句时,b线程礼让,a线程继续执行。

注释Thread.yield();之后,运行结果

图2

但实际上每次的运行结果是不同的,主要还是“看CPU心情”!例如同样是未加礼让,就出现了如下所示的运行结果

图3

5.4 线程强制执行

  • Join合并线程,待此线程执行完成之后,再执行其他线程,其他线程阻塞
  • 可以类比插队
package com.duo.state;

//测试join方法
public class JoinTest implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("线程VIP来了" + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        JoinTest joinTest = new JoinTest();
        Thread thread = new Thread(joinTest);
        thread.start();

        //主线程
        for (int i = 0; i < 500; i++) {
            if (i == 200) {
                thread.join();
            }
            System.out.println("main" + i);
        }
    }
}

运行结果(部分截取):

图4

可以发现,主线程中,只有当i在达到200之后才会接着之前“插队”的VIP线程继续执行。


原文地址:https://blog.csdn.net/qq_51916086/article/details/134700809

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_13595.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注