前言

在日常的开发过程中,我们通过会使用Thread.sleep模拟一个耗时的任务执行过程。

在深入理解这四个方法之前,首先对线程的状态进行理解阐述。

线程概念

线程是操作系统执行任务的基本单位,处理器的数量决定了不可能所有的线程同时得到运行,这就意味着需要通过某种算法,如window下的抢占式,进行线程的调度。注:就绪也就是可运行状态,拥有CPU资源但还未处于运行中。

 

一个线程从开始到结束可能会有上述几种状态,之间可以互相转换。

Thread.sleep

Sleep意味着线程主动告诉操作系统自己要休息 n 毫秒。

  1. Thread.sleep(0) 进入就绪状态
    如果n=0时,意味着当前线程的时间片没有用完,主动放弃自己剩下的时间片,进入就绪状态。这种情况下只能调度优先级相等或更高的线程,意味着优先级低的线程很难获得时间片,很可能永远都调用不到。当没有符合条件的线程,会一直占用 CPU 时间片,造成 CPU 100%占用率。
  2. Thread.sleep(1) 进入阻塞状态
    如果n>0,会强制当前线程放弃剩余时间片,并休息n秒(因为不是实时操作系统,时间无法保证精确,一般可能会滞后几毫秒或一个时间片),进入阻塞状态。这种情况下所有其它就绪状态的线程都有机会竞争时间片,而不用在乎优先级。无论有没有符合的线程,都会放弃 CPU 时间,因此 CPU 占用率较低。

Thread.yield

Yield 的中文翻译为 “让步,让位”,这里意思是当前线程主动让出时间片,并让操作系统调度其它就绪态的线程使用时间片。

  • 如果调用 Yield,只是把当前线程放入到就绪队列中,而不是阻塞队列
  • 如果没有找到其它就绪态的线程,则当前线程继续运行
  • 比 Thread.Sleep(0) 速度要快,可以让低于当前优先级的线程得以运行

Thread.wait

前面已经介绍过,详见通信机制:http://www.cnblogs.com/jjfan0327/p/6830478.html

Thread.join

作用:join方法的作用是加入其它线程,join方法的所在当前线程会将当前CPU执行权让给加入的线程(调用join方法的线程对象),直到加入线程执行完毕才会继续执行其它线程;

join在内部调用了wait(long)方法来实现的,所以join有释放锁的特点。ThreadA.join()表示如果线程A获抢到锁后,会调用内部wait方法,再次释放,使其他线程先执行完毕再抢占锁。

public final void join(); 这个方法会使当前调用的线程进行等待,直至调用的这个方法结束。如果线程被中断会抛出InterruptedException。

public final synchronized void join(long millis); 这个方法会使当调用的线程结束或者等待你声明的时长。等待的时间由操作系统决定。并不能保证当前的线程等待时间是确定的。

public final synchronized void join(long millis, int nanos); 同上,时间细化至毫微秒。

这面这个例子展示了Thread join 的用方法。这段代码的主要目的是确保main线程最后一个执行完,且第三个线程启必须等第一个线程执行完。

线程状态以及sleep yield wait join方法的更多相关文章

  1. sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十五)

    Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...

  2. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  3. Thread.yield和join方法

    参考:http://blog.csdn.net/dabing69221/article/details/17426953 一. Thread.yield( )方法: 使当前线程从执行状态(运行状态)变 ...

  4. sleep(),wait(),yield()和join()方法的区别

    sleep() sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级 的线程得到执行的机会,也可以让低优先级的线 ...

  5. java多线程基础(二)--sleep(),wait,()yield()和join()方法

    1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”.不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait()方法 在其他线程调用 ...

  6. java线程基础巩固---分析Thread的join方法详细介绍,结合一个典型案例

    关于Thread中的join方法貌似在实际多线程编程当中没怎么用过,在当初学j2se的时候倒时去学习过它的用法,不过现在早已经忘得差不多啦,所以对它再复习复习下. 首先先观察下JDK对它的介绍: 其实 ...

  7. 模拟做饭系统(java+线程中的join方法)

    (一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...

  8. Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt

    Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...

  9. 线程中的join方法

    join方法的作用是同步线程. 1.不使用join方法:当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完,程序才会退 ...

随机推荐

  1. ArrayBuffer转base64详解

    先贴代码: const base64String = window.btoa(String.fromCharCode(... new Uint8Array(buffer))) 看起来非常的简洁,优美. ...

  2. Flutter 拖拽排序组件 ReorderableListView

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 ReorderableListView是通过长按拖动某一项 ...

  3. 最适合初学者的一篇 Ribbon 教程

    什么是 Ribbon Ribbon 是一个基于 HTTP 和 TCP 的 客服端负载均衡工具,它是基于 Netflix Ribbon 实现的. 它不像 Spring Cloud 服务注册中心.配置中心 ...

  4. Rust入坑指南:智能指针

    在了解了Rust中的所有权.所有权借用.生命周期这些概念后,相信各位坑友对Rust已经有了比较深刻的认识了,今天又是一个连环坑,我们一起来把智能指针刨出来,一探究竟. 智能指针是Rust中一种特殊的数 ...

  5. JavaScript的类数组

    类数组对象啊,被人问到它跟真正的数组对象有什么差别啊?说不上来就老埋汰了,只知道函数的arguments对象是个类数组对象,也有length属性,其他呢?干货奉上: 首先先说说数组吧: 1,当有新的元 ...

  6. 06 Linux 的常用命令

    Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如 磁盘操作.文件存取.目录操作.进程管理.文件权限 设定等 在职场中,大量的 服务器维护工作 都是在 远程 通过 SSH 客户端 来完成的 ...

  7. 【S2-053】Struts2远程命令执行漏洞(CVE-2017-12611)

    继S2-052之后,Apache Struts 2再次被曝存在远程代码执行漏洞,漏洞编号S2-053,CVE编号CVE-2017-1000112. 当开发人员在Freemarker标签中使用错误的构造 ...

  8. 上线前测试的bug,要不要处理,跟版本的关系

    最近有两个项目是在旧版本上实施的.上线前经过一轮测试后,发现了一些产品(我们的产品确实不稳定) 在这个项目上,修改产品bug是肯定的.但是要不要追踪这些bug? 这就跟版本使用范围有关系了,毕竟要考虑 ...

  9. 【翻译】.NET 5 Preview 1 发布

    .NET 5 Preview 1 发布 去年年底,我们发布了.NET Core 3.0和3.1.这些版本添加了桌面应用程序模型Windows Forms(WinForms)和WPF,ASP.NET B ...

  10. js 小练习题

    <script> /*1.结论,IIFE中运行顺序3,1,执行test(4),会传递参数*/ /*var a=5; var test = (function(a){ console.log ...