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只能在同步方法或者同步块中使用。


相关文章
|
1月前
|
设计模式 Java 调度
多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法
多案例理解Object的wait,notify,notifyAll与Thread的sleep,yield,join等方法
43 1
|
1月前
|
Java
在多线程中sleep()和wait()的区别(详细)
在多线程中sleep()和wait()的区别(详细)
|
9月前
sleep () 和 wait () 的区别
sleep () 和 wait () 的区别
42 0
|
10月前
|
Java 程序员
sleep 和 wait 的区别
Java 中,线程的 "sleep" 和 "wait" 方法区别
88 0
|
消息中间件 安全 Java
|
安全 Java 中间件
Thread.sleep(0)的作用
在源码中经常能看到sleep(0)的操作,今天来总结下sleep(0)的作用到底是啥
384 0
线程 - wait & sleep 区别
线程 - wait & sleep 区别
90 0
|
Java
sleep与wait区别
第一个区别是在对系统资源的占用上。 wait是Object类的一个函数(也就意味着所有对象都有这个函数),指线程处于进入等待状态,此时线程不占用任何资源,不增加时间限制。wait可以被notify和notifyAll函数唤醒(当然这两个同时也是Object的函数)。 而sleep则是Thread类的一个函数,指线程被调用时,占着CPU不工作。此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。
115 0
|
监控
sleep 与 wait 区别
sleep 与 wait 区别
87 0