美文网首页
sleep和wait的区别

sleep和wait的区别

作者: 叫我胖虎大人 | 来源:发表于2019-08-13 11:43 被阅读0次

基本差别

  • sleep是Thread类的方法,wait是Object类中定义的方法
  • sleep方法可以在任何的地方使用
  • wait方法只能在sychronized方法或synchronized块中使用

最主要的本质区别

  • Thread.sleep()只会让出CPU,不会导致锁行为的改变
  • Object.wait()不仅会让出CPU,还会释放已经占有的同步资源

代码演示

示例1

public class CycleWait implements Runnable{

    private String value;

    @Override
    public void run() {
        try{
            Thread.sleep(5000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        value = "We have data now";
    }

    public static void main(String[] args) throws InterruptedException {


        CycleWait cycleWait = new CycleWait();
        Thread t = new Thread(cycleWait);
        t.start();
        System.out.println("Value : " + cycleWait.value);
        //主线程的等待方
        while (cycleWait.value == null){
            Thread.sleep(100);
        }
        System.out.println("Value : " + cycleWait.value);
    }
}

运行结果

Value : null
Value : We have data now

Value在线程t休眠5秒之后才完成赋值操作


示例2

package com.mmall.concurrency.thread;

public class WaitSleepDemo {

    public static void main(String[] args) {
        final Object lock = new Object();
        new Thread(() -> {
            try {
                System.out.println("Thread A is waiting to get lock");
                synchronized (lock){
                    System.out.println("Thread A get lock");
                    Thread.sleep(20);
                    System.out.println("Thread A do wait method ");
                    //线程A释放锁
                    lock.wait();
                    System.out.println("Thread A is done ---");
                }
            }catch (InterruptedException e ){
                e.printStackTrace();
            }
        }).start();

        //设置成2000,线程A的wait操作释放锁之后,主线程等待,并没有进入线程B,这个时候还是线程A先完成工作
        try{
            Thread.sleep(20);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        new Thread(() -> {
            try {
                System.out.println("Thread B is waiting to get lock");
                synchronized (lock){
                    System.out.println("Thread B get lock");
                    Thread.sleep(20);
                    lock.notifyAll();
                    System.out.println("Thread B is done ---");
                }
            }catch (InterruptedException e ){
                e.printStackTrace();
            }
        }).start();
    }
}

关于notify
运行结果

Thread A is waiting to get lock
Thread A get lock
Thread A do wait method
Thread B is waiting to get lock
Thread B get lock
Thread B is done ---
Thread A is done ---

相关文章

  • Java中wait和sleep方法有什么区别?

    参考Java中wait和sleep方法的区别java中的 sleep() 和 wait() 有什么区别? wait...

  • sleep和wait区别以及while死循环

    sleep()和wait()区别 sleep()和wait()的区别属于老生常谈了,大部分Java面试或者笔试都会...

  • sleep() wait() 区别

    sleep() wait() 区别 wait()和sleep()最大的不同在于:wait()会释放对象锁,而sle...

  • 线程——wait和sleep

    wait()和sleep()的区别 sleep(): 1、sleep()是Thread类的方法; 2、sleep(...

  • 面试相关之 Java 并发

    1. sleep()和wait()的区别?参考回答:sleep()来自Thread类;wait()来自Object...

  • 线程考点

    1、sleep和wait的区别 sleep是Thread类的方法、wait是Object类中定义的方法sleep方...

  • Java多线程

    Java中的sleep()和wait()的区别 sleep属于Thread类的静态方法。而wait()方法,则是属...

  • 【进阶】 wait sleep

    wait sleep 区别 不同: wait会释放锁,而sleep不会释放锁 wait只能在同步方法和同步代码块中...

  • java sleep和wait相关知识汇总

    java sleep和wait的区别? sleep是Thread类的方法,wait是Object类中的方法,尽管这...

  • 解答

    Java sleep 和wait区别sleep 休眠让出CUP,不改变锁的状态wait 让出CUP,也将锁让出

网友评论

      本文标题:sleep和wait的区别

      本文链接:https://www.haomeiwen.com/subject/walvjctx.html