wait方法

7aec54e736d1

  1. New:初始状态,线程被创建,没有调用start()

  2. Runnable:运行状态,Java线程把操作系统中的就绪和运行两种状态统一称为“运行中”

  3. Blocked:阻塞,线程进入等待状态,线程因为某种原因,放弃了CPU的使用权

  4. Waiting:等待状态

  5. timed_waiting:超时等待状态,超时以后自动返回

  6. terminated:终止状态,当前线程执行完毕

wait使线程从Running到Waitingsleep使线程从Running到timed_waiting:超时等待状态,时间一到自动变回Running状态可以看出wait和sleep都可以使线程中止,但是也存在许多不同,下面就逐一来看下wait和sleep的不同之处

区别

一、sleep是Thread的方法,wait是Object的方法

二、sleep不会去释放锁,但是wait会释放这个锁,并把这个wait的线程加入到这个锁的等待队列中去

三、使用wait必须要定义一个synchronized,而sleep不需要

四、使用sleep不需要被唤醒,但是wait是需要notify()或者notifyAll()去唤醒的,除了wait(1000)这种形式

为什么wait,notify,notifyAll定义在Object中?

这是个设计相关的问题,它考察的是面试者对现有系统和一些普遍存在但看起来不合理的事物的看法。回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原因。一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值