学编程 ❀(๑╯◡╰๑)❀ 就上soxunxi.cn!这里有CMS,CSS,NET,PHP,Linux,HTML,JAVA,MySQL,Python等教程.
当前位置: JAVA > java wait和sleep的区分是什么【JAVA教程】,java,wait,sleep,区别

所以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网别的相干文章!

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

分享到:
赞(0) 打赏

支付宝扫一扫打赏

微信扫一扫打赏

上一篇:

下一篇:

相关推荐

0 条评论关于"java wait和sleep的区分是什么【JAVA教程】,java,wait,sleep,区别"

最新评论

    暂无留言哦~~

博客简介

看古风美女插画Cos小姐姐,素材合集图集打包下载:炫龙网,好看二次元插画应有尽有,唯美小姐姐等你来。

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

服务热线:
 

 QQ在线交流

 旺旺在线