Skip to content

2019-08-08:谈一谈线程sleep()和wait()的区别? #117

Open
@MoJieBlog

Description

@MoJieBlog
Collaborator

截止今天,关于线程的面试题我能想到的问题基本上都问了。大家看有没有什么我没想到的问题,可以去问题征集区填写下。或者直接群里发出来也行。

Activity

DaveBoy

DaveBoy commented on Aug 8, 2019

@DaveBoy

wait:资源不持有,object方法
sleep:资源持有,线程方法

Qiang11

Qiang11 commented on Aug 8, 2019

@Qiang11

wait: 释放锁
sleep: 没有释放锁

qq245425070

qq245425070 commented on Aug 8, 2019

@qq245425070

sleep 是Thread类的方法,wait是Object类的方法
sleep不释放锁,wait释放锁
sleep不需要Synchronized ,wait需要Synchronized
sleep不需要唤醒,wait需要唤醒(除wait(int time))

gabyallen

gabyallen commented on Aug 8, 2019

@gabyallen

wait()的线程状态能够被notify,notufyall唤醒,而sleep()的线程状态不能被唤醒。
wait()进入等待期会释放锁,sleep()不会释放锁
wait只能在同步(synchronize)环境中被调用,而sleep不需要

sunzhibindev

sunzhibindev commented on Aug 8, 2019

@sunzhibindev

sleep()和wait() CPU时间片都会释放
notify() 只唤醒一个等待(对象的)线程并使该线程开始执行
notifyAll() 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现

fogcoding

fogcoding commented on Aug 8, 2019

@fogcoding

wait()的线程状态能够被notify,notufyall唤醒,而sleep()的线程状态不能被唤醒。
wait()进入等待期会释放锁,sleep()不会释放锁
wait只能在同步(synchronize)环境中被调用,而sleep不需要

sleep 也是可以被唤醒的,通过interupt方法,但是会抛出一个打断异常,只要捕获它,程序依然能够继续执行。
https://www.cnblogs.com/thinfog/p/11250913.html
这是我对于线程状态的研究,如有错误,请大家指教。

18361237136

18361237136 commented on Aug 13, 2019

@18361237136

sleep是Thread里面的方法,wait是Object里面的方法
sleep不释放锁,wait释放锁
sleep不能被唤醒,wait可以被唤醒
sleep不需要synchronize,wait需要

Czy0201

Czy0201 commented on Aug 14, 2019

@Czy0201

sleep 是Thread的 wait是Object的
sleep 不释放锁 wait释放锁(wait需要notify或者notifyall来唤醒,只能在synchronize里面用)

Alex-Cin

Alex-Cin commented on Aug 29, 2019

@Alex-Cin

我想提另外一个问题, thread.yield 和 thread.join

public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
suagger

suagger commented on Nov 11, 2019

@suagger

wait是Object中的方法,sleep是Thread中的方法
wait会释放锁,sleep不释放锁
wait只能在synchronize中使用,需要notify或者notifyall来唤醒;sleep不需要被唤醒
sleep也可以被唤醒,使用interupt方法,但是需要捕获异常

syx103

syx103 commented on Nov 11, 2019

@syx103

1.sleep是Thread的静态方法,所以通过对象名.sleep()调用并不会使得该对象线程进入休眠,而是当前线程进入休眠,wait()是Object类中的方法,因为锁对象是任意的,而Object类是所有类的基类。
2.sleep()调用之后不释放锁,wait()方法调用之后释放锁。
3.sleep()方法必须要传入参数,而wait()方法可以传入也可以不传入参数,参数即为时间。
4.sleep()方法可以用在任何地方,wait()方法只能用在同步方法或者同步代码块中。因为wait(),notify(),notifyAll()都是对锁对象所在的线程进行操作,必须先要有锁对象。
5.sleep()方法不需要唤醒,在一定时间后(即参数),该线程会自动醒来,wait()必须由notify()或者notifyAll()来唤醒

midFang

midFang commented on May 25, 2021

@midFang

我想问一个问题,wait() 之后一定要 notify 之后才能唤醒嘛 ?

    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("run start ");
                synchronized (mObject) {
                    try {
                        mObject.wait(2000);
                        System.out.println("run continue ");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("run stop ");
            }
        }).start();
    }

运行结果是这样的,这里并没有 notify ,wait 之后的代码也运行了,这是为什么 ?

run start 
run continue 
run stop 
fogcoding

fogcoding commented on May 31, 2021

@fogcoding

image
你这里,是等待2秒,并不是永远等待

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @Alex-Cin@qq245425070@MoJieBlog@Czy0201@DaveBoy

        Issue actions

          2019-08-08:谈一谈线程sleep()和wait()的区别? · Issue #117 · Moosphan/Android-Daily-Interview