【sleep和wait区别:非常清楚】

sleep和wait区别

    New:初始状态,线程被创建,没有调用start() Runnable:运行状态,Java线程把操作系统中的就绪和运行两种状态统一称为“运行中” Blocked:阻塞,线程进入等待状态,线程因为某种原因,放弃了CPU的使用权 Waiting:等待状态 timed_waiting:超时等待状态,超时以后自动返回 terminated:终止状态,当前线程执行完毕
wait使线程从Running到Waiting sleep使线程从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类中因为锁属于对象。

1.某个线程只有成为对象Monitor的owner才有机会调用wait方法进入waitset中; 2.某个线程只有成为对象Monitor的owner才有机会调用notify、notify all方法唤醒waitset中的线程; sleep(long)和wait(long)进入TimedWaiting状态,但wait()会进入Waiting状态
interrupt()方法打断,正常运行的程序打断时打断时标记会置为true 设置打断标记应该是true,清除打断标记应该就是false 如果被打断线程正在 sleep,wait,join 会导致被打断的线程抛出 InterruptedException,并清除打断标记;如果打断的正在运行的线程,则会设置 打断标记;park 的线程被打断,也会设置打断标记
经验分享 程序员 微信小程序 职场和发展