线程中的sleep, yield, join

news2024/9/25 19:19:53

1. 前言

今天以具体实例的方法来详细记录下实战中的sleep, yield, join。 到底是什么意思,应该怎么用呢???

2. 适合人群

  • 对该类方法的概念比较模糊的人

3. 开始

3.1 sleep

  1. 此方法是一个静态方法,可以通过类名直接调用Thread.sleep
  2. 调用此方法表示线程进入休眠状态。 当前线程会暂停一段时间,将执行权让给其他的线程来执行。唤醒时间由睡眠时间所决定。
    public static void testSleep() throws InterruptedException {
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("A" + i);
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();

        System.out.println("开始了....");
        // 此处休眠是让主线程进行休眠
        Thread.sleep(1000);
        System.out.println("结束了...");
    }
  • 使用Thread.sleep 表示所处的线程进行休眠的。
  • 如上述代码所示,当我在lambda表达式中调用此方法的时候,表示上述lambda表达式所处的线程进行休眠
  • 如果想主线程进行休眠的话,可以在主线程中调用函数Thread.sleep

3.2 yield

  • 使用Thread.yield的话,当前线程会暂停下来并放入等待队列(线程还是处于就绪状态,随时被CPU调用)。
  • 系统调度算法依旧会从等待队列中随机获取线程并且执行。有可能还是上次放入的线程
  • 总结:使用该API后,将API放入到等待队列中,跟别的等待线程获得同样的被获取执行的机会
    public static void testYield() {
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                if (i % 10 == 0) {
                    System.out.println("A: 此时我抢到了..." + i);
                    Thread.yield();
                }
            }
        }).start();

        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                if (i % 10 == 0) {
                    System.out.println("B: 此时我抢到了..." + i);
                    Thread.yield();
                }
            }
        }).start();
    }

3.3 join

  1. 此时有线程A, B 两个线程
  2. 在B线程中 执行了A.join了。 说明将A线程添加到B线程中执行。如果B线程想要执行的话, 必须等待A线程执行结束
  3. 总结:将一个A线程添加到另一个B线程中执行,只有线程A执行结束后,线程B才可以执行。
  4. 所以如果是自己jon 自己的话,没有任何意义的
    public static void testJoin() {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("我是线程A" + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                t1.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            for (int i = 0; i < 10; i++) {
                System.out.println("我是线程B" + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        t1.start();
        t2.start();
    }

其实我们都知道线程是异步的,如果我想在主线程中等待子线程执行结束后,才能执行主线程剩余的逻辑怎么办呢??? 下面给大家列举一个例子:

    public static void testMain() throws InterruptedException {
        System.out.println("主线程开始了...");

        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(100);
                    System.out.println("这是子线程内容..." + (i + 1));
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        t.start();
        t.join();

        System.out.println("主线程结束了...");
    }

在这里插入图片描述

4. 结束

今天的分享就到这里了。虽然内容不对,但是对于概念不清楚的人绝对是干货,建议大家手动练起来,才能更好的记住。如果喜欢小编的文章,请点赞收藏哦.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MyBatis】安装 + 框架搭建 + 使用 + 优化(全程一条龙服务讲解~)

目录 前言 一、准备工作 1.1、下载MyBatis 1.2、数据库设计 二、搭建框架 2.1、创建Maven项目 2.2、jar包、引入依赖 2.3、创建MyBatis核心配置文件 2.4、映射文件 2.5、通过junit测试功能 2.6、框架优化 三、小结——注意事项 前言 本篇全程从0到1搭建MyBatis框架…

Python编程 简单春节倒计时教程(附源代码)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.应用的技术 1.Tkinter 2.PHotoimage 函数 3.label组件 二.效果图 三…

pytorch 咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第P6周&#xff1a;好莱坞明星识别&#x1f356; 作者&#xff1a;K同学啊一、前期准备 1.设置GPU import torch from torch import nn …

2022 年 pnpm 为什么这么火?

pnpm是 Node.js 的替代包管理器。它是 npm 的直接替代品&#xff0c;但速度更快、效率更高。 为什么更有效率&#xff1f;当你安装一个包时&#xff0c;我们将它保存在你电脑上的全局存储中&#xff0c;然后我们从它创建一个硬链接而不是复制。也就是说&#xff1a;对于模块的…

8.移动端学习-rem适配方案

1.适配方案 1、当设备尺寸发生变化时&#xff0c;页面宽高等比例变化 2、使用媒体查询根据不同设备按比例设置html字体大小&#xff0c;页面元素使用rem做单位&#xff0c;当html字体大小变化&#xff0c;元素尺寸也会发生变化&#xff0c;从而达到等比缩放的适配 2.rem实际开…

ubuntu18.04运行ORB_SLAM2

1、基础工具安装 安装cmake、git、gcc、g。 sudo apt-get install cmake git gcc g 2、安装Eigen库 在终端输入以下代码。 sudo apt-get install libeigen3-dev 3、安装Pangolin0.5 版本过高会导致错误&#xff0c;安装依赖项。 sudo apt-get install libglew-dev libpyth…

Hadoop之Hdfs

一、基本概述 1、定义 HDFS&#xff08;Hadoop Distributed File System&#xff09;&#xff0c;它是一个文件系统&#xff0c;用于存储文件&#xff0c;通过目 录树来定位文件&#xff1b;其次&#xff0c;它是分布式的。HDFS 的使用场景&#xff1a;适合一次写入&#xff0…

这是长新冠,还是我老了?浙江出国抢订单又抢CTO;脉脉发布人才迁徙报告;元宇宙产业生态图谱;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f3a1; 这是长新冠&#xff0c;还是我老了&#xff1f; 感染后身体出现了疲劳、关节疼痛、咳嗽等新症状&#xff1f;你并不孤单&#xff01;约翰霍普金斯…

数据结构进阶 二叉树OJ题一

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍几道二叉树的oj题 二叉树OJ题题目一 根据二叉树创建字符串题目二 二叉树的层序遍历题目三 二叉树的最近公共祖先题目一 根据…

自动化信息治理:推动价值、安全性和合规性

现代组织充斥着数据&#xff0c;但信息的洪流可能变得势不可挡&#xff0c;危及利用其价值的能力。内容服务解决方案能够减轻洪水泛滥的风险&#xff0c;并帮助组织更好地控制信息。 从信息中获取价值的不同之处在于治理。建立正确的治理框架&#xff0c;组织可以最大限度地利…

难以挖掘的真相——塑料版薯条、意大利面、披萨……

下方图片中的“美食”&#xff0c;看起来是不是十分美味&#xff1f; ▲莱佛士平面设计学生作品 可千万要擦亮眼睛&#xff0c;它们其实是&#xff1a;黄色瓶盖“蛋黄”的荷包蛋&#xff0c;黄色吸管的“薯条”&#xff0c;桔黄色的塑料带子“意大利面”&#xff0c;红色塑料袋…

Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法

系列文章目录 Exynos4412的Linux时钟驱动开发&#xff08;一&#xff09;——Exynos4412的时钟管理单元CMU Exynos4412的Linux时钟驱动开发&#xff08;二&#xff09;——clock的初始化&#xff08;CLK_OF_DECLARE的机制&#xff09; Exynos4412的Linux时钟驱动开发&#x…

新蜂商城 -- 代码学习研读

新蜂商城 -- 代码学习研读1.Big Data -- Postgres1.1 Big Data -- Postgres2.Big Data -- Postgres3.AwakeningGit Website: https://github.com/newbee-ltd/newbee-mall. 新蜂商城线上预览地址: http://mall.newbee.ltd. &#x1f449;&#x1f449;学习的朋友给个小星星.感…

蓝牙标签操作流程

电脑网页端后台系统 下载蓝牙标签APP注册账号&#xff0c;登录电脑网页端即可制作模板 蓝牙标签管理系统 安卓手机系统 1. 使用手机浏览器扫码下载 2. 拷贝链接到手机浏览器下载 http://a.picksmart.cn:8088/picksmart/app/new-app-release-v3.0.31.apk 苹果手机系统&#…

公众号运营要做什么?公众号运营规划方案分享

你真的理解什么是公众号运营吗&#xff1f; 公众号运营遵循的是创作-分发-增长-变现的路径&#xff0c;从内容创作到内容分发到用户增长&#xff0c;到最终的转化变现&#xff0c;这才是完整的一个运营闭环&#xff0c;在这条路径中&#xff0c;缺少了哪一环都将影响整体运营效…

学习笔记之范海鹰微表情识别

微表情识别1. 微表情由来1.1 基本情绪和次级情绪1.2 保罗埃克罗的贡献2. 微表情意义2.1 微表情产生原理2.2 微表情的形态意义2.3 微表情的读心内涵2.4 微表情的应用价值3.微表情面部表情3.1 基线反应3.2 惊讶3.3 厌恶、轻蔑3.4 愤怒3.5 恐惧3.6 悲伤3.7 愉悦作为网上冲浪12级选…

redis实现session管理以及缓存穿透与雪崩

小伙正在评博客之星&#xff0c;欢迎大家来互相助力 我的链接 redis实现session管理以及缓存穿透与雪崩一、Redis实现分布式Session管理1 管理机制2 开发Session管理1. 引入依赖2. 开发Session管理配置类3.打包测试即可二、缓存穿透与雪崩缓存穿透缓存击穿&#xff08;量太大&a…

APSIM练习 2:残留物覆盖对休耕期间土壤储水的影响

跟踪覆盖度随着残留物分解而下降。 APSIM 模拟了作物残茬对休耕期间水分捕获和保留效率的影响。随着残留物分解&#xff0c;残留物覆盖率下降。在 APSIM 中模拟残留物分解以响应天气以及残留物的化学成分。通过进行此模拟&#xff0c;您将加强在先前练习中学到的技能&#xff0…

如何给藏品赋能?元宇宙电商NFG系统助力跨境电商新机遇

当前营销市场已陷入沉闷、难以创新的困境&#xff0c;大环境不容乐观&#xff0c;品牌方迫切需要新的创意与内容来吸引消费者。数字藏品是 Z世代和千禧一代在自我表达和社交方面的新兴媒介&#xff0c;在展示形式和互动方式上突破了传统营销方式的局限&#xff0c;帮助品牌在营…

github上传代码记录

文章目录新建仓库执行命令新建仓库 首先先创建一个仓库&#xff08;在主页面中点击New即可创建&#xff09; 填写仓库名称&#xff08;剩下的可以不用点击选择&#xff09; 创建完成之后&#xff0c;github上就会出现提交的提示代码。我们选择第一个进行代码的提交。 执行命…