Sleep()和wait()方法的区别

简介: Sleep()和wait()方法的区别

Sleep()和wait()方法的区别

线程sleep 和wait 的区别:

1、这两个方法来自不同的类分别是Thread和Object

2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)

4、sleep必须捕获异常,wait,notify和notifyAll同样需要捕获异常(之前看到网上很多博客都说wait方法不需要抛出异常这个观点是错误的,千万不要被误导了!!!!!!!notify和notifyAll方法确实可以不用抛出异常)

不加抛异常处理的会编译通不过

此时运行这个可以看到控制台报错

提示“必须对其进行捕获或声明以便输出”

下面是一个正常的代码

import java.io.File;
/**
 * @author zhouyanxiang
 * @create 2020-10-2020/10/20-16:00
 */
public class Solution {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(1000);
        Solution s2 = new Solution();
        s2.test();
    }
    public void test() {
        Object o = new Object();
        new Thread(()->{
            synchronized (o) {
                System.out.println("111111");
                try {
                    o.wait();
                    System.out.println("333333");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t1").start();
        new Thread(()->{
            synchronized (o) {
                System.out.println("oooooo");
                try {
                    o.wait();
                    System.out.println("xxxxxx");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t3").start();
        new Thread(()->{
            synchronized (o) {
                System.out.println("tttttt");
                try {
                    o.wait();
                    System.out.println("ssssss");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"t4").start();
        new Thread(()->{
            synchronized (o) {
                System.out.println("222222");
                o.notifyAll();
                System.out.println("444444");
                System.out.println("555555");
                System.out.println("666666");
                System.out.println("777777");
                System.out.println("888888");
                System.out.println("999999");
            }
        },"t2").start();
    }
}

最后输出

证明了notifyAll是先唤醒最近正在等待的,依次往上唤醒。

5、sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者。

共同点:

它们都可以被interrupted方法中断。

Thread.Sleep(1000) 意思是在未来的1000毫秒内本线程不参与CPU竞争,1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。另外值得一提的是Thread.Sleep(0)的作用,就是触发操作系统立刻重新进行一次CPU竞争,竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。

wait(1000)表示将锁释放1000毫秒,到时间后如果锁没有被其他线程占用,则再次得到锁,然后wait方法结束,执行后面的代码,如果锁被其他线程占用,则等待其他线程释放锁。注意,设置了超时时间的wait方法一旦过了超时时间,并不需要其他线程执行notify也能自动解除阻塞,但是如果没设置超时时间的wait方法必须等待其他线程执行notify。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

从使用角度看,sleep是Thread线程类的方法,而wait是Object顶级类的方法。

sleep可以在任何地方使用,而wait只能在同步方法或者同步块中使用。


相关文章
|
6月前
|
设计模式 Java 调度
多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法
多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法
85 1
|
6月前
|
Java
在多线程中sleep()和wait()的区别(详细)
在多线程中sleep()和wait()的区别(详细)
sleep () 和 wait () 的区别
sleep () 和 wait () 的区别
86 0
|
Java 程序员
sleep 和 wait 的区别
Java 中,线程的 "sleep" 和 "wait" 方法区别
129 0
|
Java
java多线程中sleep和wait的4个区别,你知道几个?
sleep和wait的区别是面试中一个非常常见的问题,因为从表象来看,好像sleep和wait都能使线程处于阻塞状态,但是却有着本质上的却别。这篇文章就来好好分析一下。 整体的区别其实是有四个: 1、sleep是线程中的方法,但是wait是Object中的方法。 2、sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。 3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。 4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。 下面我们就根据这四个区别来分析。
298 0
java多线程中sleep和wait的4个区别,你知道几个?
线程 - wait & sleep 区别
线程 - wait & sleep 区别
119 0
|
Java
sleep与wait区别
第一个区别是在对系统资源的占用上。 wait是Object类的一个函数(也就意味着所有对象都有这个函数),指线程处于进入等待状态,此时线程不占用任何资源,不增加时间限制。wait可以被notify和notifyAll函数唤醒(当然这两个同时也是Object的函数)。 而sleep则是Thread类的一个函数,指线程被调用时,占着CPU不工作。此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。
141 0
|
监控
sleep 与 wait 区别
sleep 与 wait 区别
114 0
|
监控 调度
线程方法:sleep( )、wait()、join( )、yield( )的区别
线程方法:sleep( )、wait()、join( )、yield( )的区别
412 0