【Java】线程插队

举报
兮动人 发表于 2022/04/28 09:30:29 2022/04/28
【摘要】 yield:线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功。join:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务。案例:main线程创建一个子线程,每隔1秒输出hello,输出20次,主线程每隔1秒,输出hi,输出20次。要求:两个线程同时执行,当主线程输出5次后,就让子线程运行完毕,主线程再继续。public class Thr...
  1. yield:线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功。
  2. join:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务。
    在这里插入图片描述
  • 案例:main线程创建一个子线程,每隔1秒输出hello,输出20次,主线程每隔1秒,输出hi,输出20次。要求:两个线程同时执行,当主线程输出5次后,就让子线程运行完毕,主线程再继续。
public class ThreadMethod02 {
    public static void main(String[] args) throws InterruptedException {

        T3 t3 = new T3();
        t3.start();

        for(int i = 1; i <= 20; i++) {
            Thread.sleep(1000);
            System.out.println("主线程(小弟) 吃了 " + i  + " 包子");
            if(i == 5) {
                System.out.println("主线程(小弟) 让 子线程(老大) 先吃");
                //join, 线程插队
                t3.join();// 这里相当于让t2 线程先执行完毕
//                Thread.yield();//礼让,不一定成功..
                System.out.println("子线程(老大) 吃完了 主线程(小弟) 接着吃..");
            }

        }
    }
}

class T3 extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 20; i++) {
            try {
                Thread.sleep(1000);//休眠1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("子线程(老大) 吃了 " + i +  " 包子");
        }
    }
}

在这里插入图片描述
在这里插入图片描述

  • 如果把上面的join改为yield,就不一定礼让成功了
    在这里插入图片描述

  • 可以看到还是会一起执行
    在这里插入图片描述

  • 案例演示

  1. 主线程每隔1s,输出hi,一共10
  2. 当主线程输出到hi 5时,启动一个子线程(要求实现Runnable),每隔1s输出hello,等该线程输出10hello后,退出
  3. 主线程继续输出hi,直到主线程退出。
  4. 如图,线程插队
    在这里插入图片描述
public class ThreadMethodExercise {
    public static void main(String[] args) throws InterruptedException {
        Thread t4 = new Thread(new T4());//创建子线程
        for (int i = 1; i <= 10; i++) {
            System.out.println("hi " + i);
            if(i == 5) {//说明主线程输出了5次 hi
                t4.start();//启动子线程 输出 hello...
                t4.join();//立即将t4子线程,插入到main线程,让t4先执行
            }
            Thread.sleep(1000);//输出一次 hi, 让main线程也休眠1s
        }
        System.out.println("主线程结束...");
    }
}

class T4 implements Runnable {
    private int count = 0;

    @Override
    public void run() {
        while (true) {
            System.out.println("hello " + (++count));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count == 10) {
                System.out.println("子线程结束...");
                break;
            }
        }
    }
}

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。