• 技术文章 >java >java基础

    java sleep()和wait()的区别

    小妮浅浅小妮浅浅2021-08-02 10:19:40原创6301

    区别说明

    1、wait()是Object的方法,sleep()是Thread的方法。

    2、wait()必须采用同步方法,不需要sleep()方法。

    3、线程在同步方法中执行sleep()方法,不释放monitor锁,wait()方法释放monitor锁。

    短暂休眠后,sleep()方法会主动退出阻塞,而wait()方法需要在没有指定wait时间的情况下被其他线程中断才能退出阻塞。

    实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    import java.text.SimpleDateFormat;

    import java.util.Date;

    public class TestSleepAndWait {

    public static void main(String[] args) {

    new Thread1().start();

    try {

    Thread.sleep(100);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    new Thread2().start();

    }

    }

    class Thread1 extends Thread{

    private void sout(String s){

    System.out.println(s+" "+new SimpleDateFormat("HH:mm:ss:SS").format(new Date()));

    }

    @Override

    public void run() {

    sout("enter Thread1.run");

    synchronized (TestSleepAndWait.class){//wait只能在同步代码块或者同步方法中使用

    sout("Thread1 is going to wait");

    try {

    TestSleepAndWait.class.wait(); // 这里只能使用持有锁TestSleepAndWait.class.wait(),使用其他对象则报错java.lang.IllegalMonitorStateException

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    sout("after waiting, thread1 is going on");

    sout("thread1 is over");

    }

    }

    }

    class Thread2 extends Thread{

    private void sout(String s){

    System.out.println(s+" "+new SimpleDateFormat("HH:mm:ss:SS").format(new Date()));

    }

    @Override

    public void run() {

    sout("enter Thread2.run");

    synchronized (TestSleepAndWait.class){//wait只能在同步代码块或者同步方法中使用

    sout("Thread2 is going to notify");

    TestSleepAndWait.class.notify(); 这里只能使用持有锁TestSleepAndWait.class

    sout("thread2 is going to sleep 10ms");

    try {

    Thread.sleep(10);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    sout("after sleeping, thread2 is going on");

    sout("thread2 is over");

    }

    }

    }

    以上就是java sleep()和wait()的区别,希望对大家有所帮助。更多Java学习指路:Java基础

    本教程操作环境:windows7系统、java10版,DELL G3电脑。

    专题推荐:java sleep wait
    上一篇:Java runnable和callable的异同 下一篇:Java用户线程是什么

    相关文章推荐

    • java内置函数式接口有哪些?• java8中注解的多种用法• java之JDK注解的介绍• java中@SuppressWarnings是什么意思• java对象分配内存的两种类型• java switch语句的执行过程• java类中的两种成员访问• java this关键字的使用注意• java中&和&&有什么区别• java单例中的饱汉模式实现• java单例中饿汉模式的使用• java懒汉和饿汉模式的区别• java单例模式中的Holder是什么• java枚举类型的原理• java静态方法和非静态方法的介绍• java io和nio的区别• java进程和线程的关系• Java守护线程和用户线程的区别

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网