线程状态以及sleep yield wait join方法
前言
在日常的开发过程中,我们通过会使用Thread.sleep模拟一个耗时的任务执行过程。
在深入理解这四个方法之前,首先对线程的状态进行理解阐述。
线程概念
线程是操作系统执行任务的基本单位,处理器的数量决定了不可能所有的线程同时得到运行,这就意味着需要通过某种算法,如window下的抢占式,进行线程的调度。注:就绪也就是可运行状态,拥有CPU资源但还未处于运行中。
一个线程从开始到结束可能会有上述几种状态,之间可以互相转换。
Thread.sleep
Sleep意味着线程主动告诉操作系统自己要休息 n 毫秒。
- Thread.sleep(0) 进入就绪状态
如果n=0时,意味着当前线程的时间片没有用完,主动放弃自己剩下的时间片,进入就绪状态。这种情况下只能调度优先级相等或更高的线程,意味着优先级低的线程很难获得时间片,很可能永远都调用不到。当没有符合条件的线程,会一直占用 CPU 时间片,造成 CPU 100%占用率。 - 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方法的更多相关文章
- sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十五)
Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...
- Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- Thread.yield和join方法
参考:http://blog.csdn.net/dabing69221/article/details/17426953 一. Thread.yield( )方法: 使当前线程从执行状态(运行状态)变 ...
- sleep(),wait(),yield()和join()方法的区别
sleep() sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级 的线程得到执行的机会,也可以让低优先级的线 ...
- java多线程基础(二)--sleep(),wait,()yield()和join()方法
1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”.不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait()方法 在其他线程调用 ...
- java线程基础巩固---分析Thread的join方法详细介绍,结合一个典型案例
关于Thread中的join方法貌似在实际多线程编程当中没怎么用过,在当初学j2se的时候倒时去学习过它的用法,不过现在早已经忘得差不多啦,所以对它再复习复习下. 首先先观察下JDK对它的介绍: 其实 ...
- 模拟做饭系统(java+线程中的join方法)
(一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...
- Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt
Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...
- 线程中的join方法
join方法的作用是同步线程. 1.不使用join方法:当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完,程序才会退 ...
随机推荐
- 【前端性能优化】高性能JavaScript整理总结
高性能JavaScript整理总结 关于前端性能优化:首先想到的是雅虎军规34条然后最近看了<高性能JavaScript>大概的把书中提到大部分知识梳理了下并加上部分个人理解这本书有参考雅 ...
- c语言之学生管理系统
0x00 学生管理系统 说到学生管理系统,对于每一个初学c语言的人都是一道不得不过的砍.不过,学习c,我觉得每个人都应该写一个学生管理系统,至于为什么,我想倘若连一个学生管理系统都写不好,哪么他的c是 ...
- 获取的ajax方法return的返回值的问题解析
今天刚上班就偶遇关于获取Ajax方法return的返回值的问题,这里小记一下. 在使用jquery中,如果获取不到ajax返回值,原因有二: 一.ajax未使用同步 ajax未使用同步,导致数据未加载 ...
- vue 动态加载图片路径报错解决方法
最近遇到图片路径加载报错的问题 之前一直都是把图片放到assets的文件下的.总是报错,看到一些文章并且尝试成功了,特意记录下 首先先说明下vue-cli的assets和static的两个文件的区别, ...
- 基于springcloud搭建项目-Feign篇(四)
上一篇已经写过ribbon客户端负载均衡的用法了,这篇主要是介绍feign的用法,首先我们必须了解feign是什么?能干嘛?怎么用? 这里简单介绍一下,然后进行代码测试 1.概述 Feign是一个声明 ...
- Druid未授权(弱口令)的一些利用方式
Druid简介 1.Druid是阿里巴巴数据库事业部出品,为监控而生的数据库连接池. 2.Druid提供的监控功能,监控SQL的执行时间.监控Web URI的请求.Session监控. Druid可能 ...
- 用libvlc 抓取解码后的帧数据
vlc是一套优秀的开源媒体库,其特点是提供了完整的流媒体框架, 用它可以非常方便的实现抓取解码帧的功能. 与此功能有关的关键API为 libvlc_video_set_callbacks /*设置回调 ...
- ggplot2(9) 数据操作
9.1 plyr包简介 ddply {plyr}: Split data frame, apply function, and return results in a data frame. ddpl ...
- HTML实体符号代码
1. 特色的 © © © 版权标志 | | 竖线,常用作菜单或导航中的分隔符 · · · 圆点,有时被用来作为菜单分隔符 ↑ ↑ ↑ 上箭头,常用作网页“返回页面顶部”标识 € € € 欧元标识 ...
- python code practice(二):KMP算法、二分搜索的实现、哈希表
1.替换空格 题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析: 将长度为 ...