sleep,yield,join,notify,wait,notifyAll区别
1. Thread.sleep(long) 和Thread.yield()都是Thread类的静态方法,在调用的时候都是Thread.sleep(long)/Thread.yield()的方式进行调用。而join()是由线程对象来调用。
2. Thread.sleep(long)是让当前运行的线程睡眠一会,这里说的睡眠的意思是让线程从运行状态进入阻塞状态,只有等阻塞时间过后才进入就绪状态(并不是直接进入运行状态),是否进入运行状态就要看jvm的内部调用机制了,通常是级别较高的处于就绪状态的线程会被调度进入就绪状态。
3. 线程如果是通过继承Thread类,重写起run方法来实现的,那么在调用Thread.sleep(long)/Thread.yield()方法时当然可以不要Thread,直接使用sleep(long)/yield()。但如果是实现Runnable接口来实现的就必须有Thread。
4. 如果Thread.sleep(long)/Thread.yield()使用在由synchronized锁定的代码块或者方法当中,那么在调用他们的过程当中,并不会释放锁。而是即使是睡眠也抱着这把锁不让别人访问。
5.join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法和sleep方法都要捕获异常。
6.yield()方法是让当前线程直接由运行状态进入就需状态,然后让jvm重新调度一次,但是这次调度只会让处于就绪队列中比当前线程优先级高或者相等的线程运行,很可能某个线程在调用了yield方法后,又被jvm调度进来运行。
7.wait()和notify()、notifyAll() 这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized这个关键字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。 notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
8.我对wait的一点个人理解:将设线程为A线程、A线程持有锁(进入synchronized代码段)后执需要行同步代码,当执行到调用锁.wait()时,意思是让A线程进入阻塞状态(注意这个时候A线程的synchronized方法中锁.notify()这句代码后可能还有一大段代码没有执行就被阻塞在这里了)并且释放同步锁(释放锁的同时将自身线程放入到了该锁的等待队列当中);释放锁的瞬间其他的线程就已经获取到了该锁(这里姑且给这个其他线程起个名字叫做B线程)、当B线程调用了锁.notify()的时候其实B线程自己是一点都没有受到影响,因为这时B既没有阻塞也没有释放锁还是没事一样的执行完synchronized里面的代码;但是B线程刚刚的那句锁.notify()可以告诉虚拟机我B线程可能马上就要执行完了(当然具体多久还是程序员说了算,这个完全要看B线程的synchronized方法中锁.notify()这句代码后面还有多长没执行完),还告诉虚拟机你现在要立即从锁的等待队列中取出一个线程进入到就绪状态(这时候可能恰巧将A线程取出来了)。但这是A线程并不能立即就执行,因为B可能还没有执行完(没执行完就没有释放锁),A线程要想继续执行就必须再次获得锁;一旦B执行完,A就能获得锁了。但是A获得了锁是不是从synchronized方法重头再执行一遍呢?肯定不是!这时候A会接着上次notify()后的代码执行,这样来达到线程间通讯目的。
sleep,yield,join,notify,wait,notifyAll区别的更多相关文章
- java之sleep(),join(),yield(),wait(),notify()、notifyAll()区别
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- java多线程之yield,join,wait,sleep的区别
Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...
- java 线程之间通信以及notify与notifyAll区别。
jvm多个线程间的通信是通过 线程的锁.条件语句.以及wait().notify()/notifyAll组成. 下面来实现一个启用多个线程来循环的输出两个不同的语句. package com.app. ...
- java中wait()和sleep()的区别;notify()和notifyall()区别
先说两个概念:锁池和等待池 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入 ...
- JAVA 线程状态以及synchronized,wait,sleep,yield,notify,notifyAll
java线程存在以下几种状态: 1: 创建状态(New):线程被new出来,还未调用start 2: 就绪状态(Runnable):又称为可执行状态,调用线程的start方法后,线程处于就绪状态,,线 ...
- java线程中的wait和notify以及notifyall
一.区别与联系 1.1.wait(),notify()和notifyAll()都是java.lang.Object的方法,而确实sleep方法是Thread类中的方法,这是为什么呢? 因为wait和 ...
- 并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别
前言 今天简单的讲一讲线程中sleep(),join(),yield(),wait(),notify(),notifyAll()这些方法的使用以及区别. 不过在讲这些方法之前,需要简单的介绍一下锁池和 ...
- Java多线程Thread.yield(),thread.join(), Thread.sleep(200),Object.wait(),Object.notify(),Object.notifyAll()的区别
Thread.yield(),在某个线程里调用Thread.yield(),会使这个线程由正在运行的running状态转变为等待cpu时间片的runable状态.join()是Thread类的一个非s ...
- Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock
一.wait/notify/notifyAll都是Object类的实例方法 1.wait方法:阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒. wait等待其实是对象 ...
随机推荐
- 第三方git pull免密码更新
方法一: git pull http://账号:密码@服务器地址/xxx/xxx.git master:master 方法二: 或者使用ssh免密码,生成的pub公钥内容拷贝的auth文件里面,同时添 ...
- Python中__init__()方法注意点
此文转自https://www.cnblogs.com/zyxstar2003/archive/2011/03/21/1989954.html 1.__init__并不相当于C#中的构造函数,执行它的 ...
- jmeter.bat配置(主要关于OOM)
jmeter.bat是jmeter在windows系统下的启动文件.在使用jmeter压测,线程数设置过多时可能会报内存溢出(Out Of Memory Error),这时候可以去尝试调整一下jmet ...
- 一,ESP8266下载和刷固件(基于Lua脚本语言)
用自己的小板测试...... 安排上呢 一, ESP8266下载和刷固件(Lua开发----体验一下lua开发的魅力所在) 二, 控制一个灯亮灭 三, TCP服务器 四, TCP客户端 五, UDP ...
- 2017-2018-2 20155231《网络对抗技术》实验五: MSF基础应用
2017-2018-2 20155231<网络对抗技术>实验五: MSF基础应用 实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 实验内容 (1)各种搜索技巧的应用 比如IP2L ...
- Kafka查看topic、consumer group状态命令
最近工作中遇到需要使用kafka的场景,测试消费程序启动后,要莫名的过几十秒乃至几分钟才能成功获取到到topic的partition和offset,而后开始消费数据,于是学习了一下查看kafka br ...
- C++ 字符串, 数字 相互转化
1: strL.Format("%x", 12); //将数字12转换成,16进制字符(C),存于strL 2: strH.Format("%x",12); / ...
- CS50.5
函数,全局变量,参数,返回值. 1,类型转换. 各种数据类型进行转换 2,API函数 应用程序编程接口. application programming interface 写写随笔吧,先说计算机.. ...
- [APIO2013]机器人[搜索、斯坦纳树]
题意 题目链接 分析 记 g(d,x,y) 表示从 (x,y) 出发,方向为 d 到达的点,这个可以通过记忆化搜索求出,注意如果转移成环(此时向这个方向走没有意义)要特判. 记 f(l,r,x,y) ...
- Asp.Net_from标签中的Enctype=multipart/form-data作用
ENCTYPE="multipart/form-data"用于表单里有图片上传. <form name="userInfo" method="p ...