join(),sleep() 和 yeild() 方法的区别

article/2025/9/6 19:12:59

目录

1、join() 方法:释放锁

2、sleep() 方法:不释放锁

3、yeild() 方法:不释放锁


1、join() 方法:释放锁

使用场景:

        等待调用 join() 方法的线程结束之后,程序再继续执行,一般用于等待异步线程执行完结果之后才能继续运行的场景。

        比如,主线程创建并启动子线程,如果自线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束。如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据中的值,就要用到 join() 方法。

        易混淆知识点:join() 方法为 Thread 类直接提供的方法,而 wait() 和 notify() Object类中的方法。

        查看 join() 方法源码,底层最终调用的还是 wait() 方法:

         join() 的主要作用是使当前主线程进行等待,另外也可以指定等待的具体时间:

public class JoinTest {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new Runnable() { // 线程一@Overridepublic void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " 运行结束!");}}, "thread_1");t1.start();t1.join(); // 主线程会等待线程一运行结束// t1.join(1000);  // 超时将不再等待System.out.println("程序运行结束...");}
}

2、sleep() 方法:不释放锁

        调用 sleep() 方法会让当前线程从 Running 进入TIMED_WAITING 状态,不会释放对象锁

        睡眠结束后的线程未必会立刻得到执行,当 sleep() 传入参数为 0 时,和 yield 相同

        sleep() 方法可以被中断,其它线程可以使用 interrupt() 方法打断正在睡眠的线程,这时 sleep() 方法会抛出 InterruptedException,并且会清除中断标志

public class SleepTest {public static void main(String[] args) {Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(5000); // 会响应中断,并清除中断标记,不会睡眠 5s} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " 执行结束!");}});t1.start();t1.interrupt(); // 打上中断标记}
}

        使用场景:当 A 需要等待 B 执行完,此时 A 设置 1 小时的等待时间(睡眠 1 小时),但是 B 只用了 30 分钟便执行完了,此时可以在 B 上执行 A 的中断方法,使 A 继续执行,因此,异常也是可以被利用的。

3、yeild() 方法:不释放锁

        yield() 会释放 CPU 资源,让当前线程从 Running 进入 Runnable 状态,让优先级更高 (至少是相同)的线程获得执行机会,不会释放对象锁;但 CPU 再次调度还可能调度到本线程

        具体的实现依赖于操作系统的任务调度器

        官方不建议使用这个方法,因为线程切换CPU是有代价的

   /** <p> It is rarely appropriate to use this method. It may be useful* for debugging or testing purposes, where it may help to reproduce* bugs due to race conditions. It may also be useful when designing* concurrency control constructs such as the ones in the* {@link java.util.concurrent.locks} package.*/public static native void yield();

        相关测试代码:

public class YieldTest extends Thread{// 对象锁public static Object lock = new Object();@Overridepublic void run() {synchronized (lock) {// 加锁System.out.println(Thread.currentThread().getName() + "开始调用yield()方法");// 提醒1:打开关闭此注释查看输出效果,对比差异this.yield();// 提醒2:使用wait方法来做对比,查看释放锁与不释放锁的区别
//            try {
//                lock.wait();
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }System.out.println(Thread.currentThread().getName() + " 执行结束");}}public static void main(String[] args) {for (int i = 0; i < 100; i++) { // 创建100个线程YieldTest test = new YieldTest();test.start();}// 提醒2:配合wait使用看效果
//        synchronized (lock) {
//            lock.notifyAll();
//        }}
}

        至此,三种方法的区别介绍完毕。


http://chatgpt.dhexx.cn/article/RqFGI2M2.shtml

相关文章

C#中关于Task.Yeild()的探究

在与同事讨论async/await内部实现的时候&#xff0c;突然想到Task.Yeild()这个函数&#xff0c;为什么呢&#xff0c;了解一点C#async/await内部机制的都知道&#xff0c;在await一个异步任务&#xff08;函数&#xff09;的时候&#xff0c;它会先判断该Task是否已经完成&…

python yeild next使用注意事项

关于得带的基本使用方法&#xff0c;可以往上查一下。这里主要记录下在编码中可能遇到的报错&#xff0c;和处理方式。 import timedef func3():for i in range(5):yield iwhile True:a next(func3())print(a)time.sleep(1) 如果使用上面这种取值方式&#xff0c;你会发现会…

Java多线程礼让yeild()和插队join()方法案例

一. yeild()和join()方法 1.yeild():线程礼让&#xff0c;让当前正在执行的线程可能暂停&#xff0c;但不阻塞 2.yeild():当前正在执行的线程可能暂停&#xff0c;也可能不暂停。 3.yeild():是静态方法&#xff0c;而join()是非静态方法 4.join():能…

gitlab artifacts too large

gitlab在打包artifacts遇到&#xff1a; Uploading artifacts as “archive” to coordinator… too large archive 413 error 网上看了很多方案&#xff0c;一般都是说在admin账户的setting下找到CI/CD&#xff0c;把Maximum artifacts size (MB)改大点 当然这是其中一个点哈…

IDEA 解决 artifacts not found 问题

目录 1. 问题2. 解答方法一方法二 1. 问题 部署 Tomcat 时&#xff0c;选择 Edit Configuration 无 Artifact 选项。 2. 解答 方法一 选择 Fix 直接修复即可。 方法二 打开 Project Structure&#xff1b;选择 Aritfacts 选项&#xff1b;点击 号&#xff0c;选择 Web …

jenkins使用Send build artifacts over SSH遇到的坑

在jenkins构建项目后&#xff0c;优势需要把jar等文件复制到其他服务器&#xff0c;如下图&#xff0c;可以使用Send build artifacts over SSH功能。 但是在使用时可能会遇到无法复制成功 可以从以下几方面入手&#xff0c;基本可以解决该问题 1、检查是否配好了目标主机的用…

【论文笔记】Details or Artifacts: A Locally Discriminative Learning Approach toRealistic Image Super-Reso

细节还是伪纹理&#xff1a;真实图像超分辨率的局部判别方法 来自于CVPR2022&#xff0c;作者Jie Liang&#xff0c; Hui Zeng and Lei Zhang 论文地址&#xff1a;https://arxiv.org/abs/2203.09195 Abstract: 目前超分想要优异的纹理信息&#xff0c;那GAN&#xff08;生成…

解析IDEA中的Artifacts配置

1. Artifact 2. Artifact名称 3. Artifact类型 4. 输出路径&#xff08;也就是Deployment root部署根目录&#xff09;&#xff0c;项目运行后的输出根目录 5. 输出根目录&#xff0c;即4指定的地址 6. 输出目录下的结构层次 针对指定项目&#xff0c;对应分析 1. 输出根…

idea配置Tomcat时没有Artifacts选项

想要解决没有artifacts选项的问题&#xff0c;首先要配置项目结构。 点击加号&#xff0c;选择web 然后修改地址,编译后的文件将会生成在你修改的文件夹下&#xff0c;点击Apply应用所作的修改&#xff0c;然后点击Create Artifacts 此时idea就会在Artifacts下生成一个Web expl…

idea为web项目添加tomcat并配置Artifacts

背景 有一天聪明的小峰从网上找了一个web项目&#xff0c;但是只有代码没有启动步骤&#xff0c;作为小白的我解决这个问题也不太顺利特此记录一下。 主要解决的问题&#xff1a; 为项目添加tomact 配置Artifacts 引入 jar包 小峰找的项目地址&#xff1a;https://github.com/…

idea配置factets和Artifacts

最近需要把项目部署到服务器&#xff0c;需要打个war包&#xff0c;有好多不太明白&#xff0c;把搜索学习到的知识点汇总一下&#xff0c;以备后用&#xff0c;本人使用的版本是2020.3版本。 在说明这个配置过程之前&#xff0c;先简单的介绍一下这两个是什么&#xff0c;有什…

IDEA中WEB项目结构和Artifacts设置

公司的WEB项目结构一直比较随意&#xff0c;没有统一的规范&#xff0c;新增项目也是直接用旧的项目文件夹拷贝过去修改&#xff0c;时间长了以后项目文件结构混乱&#xff0c;研究了半天终于找到了&#xff08;可能&#xff09;正确的目录结构设置&#xff0c;能够直接输出正确…

棋盘效应(Checkerboard Artifacts)

定义&#xff1a;棋盘效应是由于反卷积的“不均匀重叠”&#xff08;Uneven overlap&#xff09;的结果。使图像中某个部位的颜色比其他部位更深&#xff1a; 具体原因&#xff1a;在反卷积操作时&#xff0c;如果卷积核&#xff08;Kernel&#xff09;大小不能被步长&#xff…

Idea 精准到类的打包方式:Artifacts 打包

这种打包方式更精确&#xff0c;可以直接精确到具体类&#xff0c;这种情况下打的包&#xff0c;上传到 Flink web 时&#xff0c;不需要手动写入 class 文件名&#xff0c;它会自动填入&#xff0c;如果没有自动填入&#xff0c;或许是你的 Flink 版本太低了&#xff0c;我的是…

Idea 2022 创建 Artifacts 运行 Tomcat 步骤

每次一个新 web 项目都被 idea 搞的晕头转向。只要是 xml 文件无法发布&#xff0c;初步判断这是 idea 的一个 bug&#xff0c;现整理如下。 首先确保 Project Structure 下 Modules 的配置正确。 Project Structure / Artifacts / 中使用 号菜单进入如下图界面。 从 Modules …

Bug:No artifacts configured

可能是因为项目是直接git下来的&#xff0c;所以项目的框架不完整&#xff0c;缺少web功能&#xff0c;因此在配置tomcat server时&#xff0c;没有artifacts可选 目前已经解决了此问题&#xff0c;因此记录一下解决的方法步骤 配置artifacts 在idea中&#xff0c;依次点击Fi…

Idea的Artifacts

Artifacts&#xff08;Web部署-2&#xff09; 项目的打包部署设置&#xff0c;这个是项目配置里面比较关键的地方&#xff0c;重点说一下。 先理解下它的含义&#xff0c;来看看官方定义的artifacts&#xff1a; An artifact is an assembly of your project assets that you…

IDEA通过Artifacts发布Web项目

今天在用IDEA运行一个Java Web项目时突然报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver&#xff0c;但是我的项目的lib目录下以及添加了jdbc的连接jar包&#xff0c;而且在IDEA中编译没有报错&#xff0c;而且之后我自己添加的两个jar包也找不到&#xff0c;但…

idea Artifacts 配置

以Artifacts方式工作 什么是artifact&#xff1f; artifact是一种用于装载项目资产以便于测试&#xff0c;部署&#xff0c;或者分布式软件的解决方案。例如集中编译class&#xff0c;存档java应用包&#xff0c;web程序作为目录结构&#xff0c;或者web程序存档等。 artifact …

IDEA中的Build Artifacts详解

使用IDEA编写完JAVA代码&#xff0c;需要对外发布时&#xff0c;我们就会用到IDEA的Build Artifacts...功能。在没有创建Artifact时&#xff0c;菜单“Build”|"Build Artifacts..."是灰化的&#xff0c;不可用。所以&#xff0c;第一步是进入project structure创建A…