旗下导航:搜·么
当前位置:网站首页 > JAVA教程 > 正文

java wait和sleep的区分是什么【JAVA教程】,java,wait,sleep,区别

作者:搜教程发布时间:2019-12-28分类:JAVA教程浏览:76评论:0


导读:所以sleep()和wait()要领的最大区分是:·sleep()就寝时,坚持对象锁,依然占领该锁;·而wait()就寝时,开释对象锁。·然则wait...

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

标签:javawaitsleep区别


欢迎 发表评论: