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

  • 19
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值