java wait和sleep的区分是什么【JAVA教程】,java,wait,sleep,区别
作者:搜教程发布时间:2019-12-28分类:JAVA教程浏览:42评论:0

所以sleep()和wait()要领的最大区分是:
·sleep()就寝时,坚持对象锁,依然占领该锁;
·而wait()就寝时,开释对象锁。
·然则wait()和sleep()都能够经由过程interrupt()要领打断线程的停息状况,从而使线程马上抛出InterruptedException(但不发起运用该要领)。
/** * Created by jiankunking on 2018/4/5. */ public class ThreadTest implements Runnable { int number = 10; public void addHundred() throws Exception { System.out.println("addHundred begin"); synchronized (this) { number += 100; System.out.println("addHundred:" + number); } System.out.println("addHundred end"); } public void wait2Seconds() throws Exception { System.out.println("wait2Seconds begin "); synchronized (this) { /** * (歇息2S,壅塞线程) * 以考证当前线程对象的机锁被占用时, * 是不是被能够接见其他同步代码块 */ System.out.println(".............wait begin.................."); this.wait(2000); number *= 200; System.out.println(".............wait end.................."); } System.out.println("wait2Seconds end "); } public void sleep2Seconds() throws Exception { System.out.println("sleep2Seconds begin "); synchronized (this) { /** * (歇息2S,壅塞线程) * 以考证当前线程对象的机锁被占用时, * 是不是被能够接见其他同步代码块 */ System.out.println("............sleep begin..................."); Thread.sleep(2000); number *= 200; System.out.println(".............sleep end.................."); } System.out.println("sleep2Seconds end "); } @Override public void run() { try { addHundred(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { ThreadTest threadTest = new ThreadTest(); Thread thread = new Thread(threadTest); thread.start(); //threadTest.sleep2Seconds(); //threadTest.wait2Seconds(); } }
当threadTest.sleep2Seconds()时,输出效果以下:
当threadTest.wait2Seconds()时,输出效果以下:
sleep2Seconds()/wait2Seconds()用secondMethod()示意:
我们来大抵剖析一下此段代码,main()要领中实例化ThreadTest并启动该线程,然后挪用该线程的一个要领(secondMethod()),由于在主线程中挪用要领,所以挪用的一般要领secondMethod())会先被实行(但并非一般要领实行终了该对象的线程要领才实行,一般要领实行过程当中,该线程的要领也会被实行,他们是交替实行的,只是在主线程的一般要领会先被实行罢了),所以程序运转时会先实行secondMethod(),而secondMethod()要领代码片断中有synchronized block,因而secondMethod要领被实行后,该要领会占领该对象机锁致使该对象的线程要领一向处于壅塞状况,不能实行,直到secondeMethod开释锁;
运用Thread.sleep(2000)要领时,由于sleep在壅塞线程的同时,并持有该对象锁,所以该对象的其他同步线程(secondMethod())没法实行,直到synchronized block实行终了(sleep休眠终了),secondMethod()要领才能够实行,因而输出效果为:
number*200+100;
运用this.wait(2000)要领时,secondMethod()要领被实行后也锁定了该对象的机锁,实行到this.wait(2000)时,该要领会休眠2S并释当前持有的锁,此时该线程的同步要领会被实行(由于secondMethod持有的锁,已被wait()所开释),因而输出的效果为:
number+100;
Java中sleep要领的几个注重点:
1、Thread.sleep()要领用来停息线程的实行,将CPU放给线程调理器。
2、Thread.sleep()要领是一个静态要领,它停息的是当前实行的线程。
3、Java有两种sleep要领,一个只要一个毫秒参数,另一个有毫秒和纳秒两个参数。
4、与wait要领差别,sleep要领不会开释锁。
5、假如其他的线程中断了一个休眠的线程,sleep要领会抛出Interrupted Exception。
6、休眠的线程在叫醒以后不保证能获取到CPU,它会先进入停当态,与其他线程合作CPU。
7、有一个易错的处所,当挪用t.sleep()的时刻,会停息线程t。这是不对的,由于Thread.sleep是一个静态要领,它会使当前线程而不是线程t进入休眠状况。
8、wait要领必需正在同步环境下运用,比方synchronized要领或许同步代码块。假如你不在同步条件下运用,会抛出IllegalMonitorStateException非常。别的,sleep要领不需要再同步条件下挪用,你能够恣意一般的运用。
9、wait要领用于和定义于Object类的,而sleep要领操纵于当前线程,定义在java.lang.Thread类内里。
ki4网,有大批免费的JAVA入门教程,迎接人人进修!
以上就是java wait和sleep的区分是什么的细致内容,更多请关注ki4网别的相干文章!
相关推荐
- java经典面试题集锦(五)_JAVA教程,java,面试题
- java中的换行符是什么_JAVA教程,java,换行符
- Java中变量必须先定义后使用么_JAVA教程,java,变量
- java中怎么定义接口_JAVA教程,java,接口
- java中静态代码块有什么特点_JAVA教程,java,静态代码块
- java中return语句有什么作用_JAVA教程,java,return
- Java对文件的读写操作(图文详解)_JAVA教程,java
- java经典面试题集锦(四)_JAVA教程,java,面试题
- 八种基本数据类型分别是什么?_JAVA教程,java,基本数据类型
- java如何将字符串转为数组_JAVA教程,java,字符串,数组
你 发表评论:
欢迎- JAVA教程排行
-
- 1接口中只能定义常量和抽象方法,对么_JAVA教程,接口,常量,抽象方法
- 2java文件不能删除文件怎么办_JAVA教程,java
- 3系统提示javac:找不到文件_JAVA教程,系统,提示,javac,找不到,文件
- 4java中sleep的用法是什么?_JAVA教程,java,sleep
- 5java后台乱码怎么办_JAVA教程,java
- 6java图片显示不出来怎么办_JAVA教程,java
- 7java eclipse无法运行怎么办_JAVA教程,java
- 8javascript和java的区别是什么_JAVA教程,javascript,java
- 9Java中split()方法怎么用_JAVA教程,java,spilt,用法
- 最新文章
- 广而告之