前言

在日常的开发过程中,我们通过会使用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线程最后一个执行完,且第三个线程启必须等第一个线程执行完。

转载于:https://www.cnblogs.com/jjfan0327/p/6855029.html

线程状态以及sleep yield wait join方法相关推荐

  1. left join 和join区别_sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇

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

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

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

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

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

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

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

  5. python线程join方法

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

  6. java线程join方法

    java线程join方法 1.join方法 ​ join方法的作用是进行线程插队,也就是说调用了join方法的线程相对于调用它的上级线程拥有跟高的执行权.调用join方法的线程的上级线程必须等待调用j ...

  7. 你能说出多线程中 sleep、yield、join 的用法及 sleep与wait区别吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:noteless cnblogs.com/noteless/ ...

  8. full outer join 与full join的区别_sleep、yield、join都是干啥的? sleep与wait有啥区别?中篇[十五]...

    点击上方 " 布衣码农 " ,免费订阅~选择" 设为星标 ",第一时间免费获得更新~ 「布衣码农」用不到却又不得不学习了解的底层方法+1.Object中的wai ...

  9. 多线程、并发/并行、自定义线程类、线程安全、守护线程、定时器、线程状态、线程池

    目录 进程和线程: 进程: 线程: 多线程的好处: 线程调度: 分时调度: 抢占式调度: 并发与并行: 线程的生命周期: 实现线程的两种基本方式(还有第三种): 创建Thread线程类: 创建Runn ...

最新文章

  1. Objective-c 网络编程1 Web请求和响应
  2. 我竟然在《我的世界》里学起了文言文
  3. Django DTL模板语法中的循环
  4. Zookeeper的Windows安装
  5. Java中nextfloat怎么用,关于java的nextFloat()后面跟一个nextLine()
  6. Linux automake命令
  7. 团队作业4——第一次项目冲刺(Alpha版本)4.23
  8. 三大运营商发5G白皮书:传统短信迎大升级 推出5G消息
  9. 数字全息实验-实例演示
  10. PID控制算法的C语言实现十 模糊算法简介
  11. 大图书馆 #2 大教堂与集市
  12. 如何破解锐捷支持多网卡
  13. 浅谈高速公路服务区分布式光伏并网发电
  14. php网页显示中文乱码的解决办法!
  15. 电子产品加拿大IC认证(ISED)指南
  16. html 画梯形容器,css怎么画梯形?
  17. jsp案例:计算矩形、圆形面积
  18. ThinkPHP5.0商城项目目录搭建(菜鸟)
  19. SASO认证辅导,没有SASO证书的产品会被沙特港口海关拒绝入境
  20. 位、字节、kb、mb等单位的换算

热门文章

  1. HDU 1166 敌兵布阵【树状数组】
  2. 日志管理最佳实践:成功的六要诀【解读版】
  3. java常见对象_Java/10_Java常见对象.md at master · DuHouAn/Java · GitHub
  4. oracle分区属于什么知识,详细讲解Oracle表分区的相关概念及其优点
  5. vue实现点击后多级标题联动变化
  6. nginx 之负载均衡 :PHP session 跨多台服务器配置
  7. NopCommerce架构分析-依赖注入
  8. c#中不同类中变量的引用方法
  9. Egret之位图字体
  10. 操作和维护经常使用的命令