您的位置:首页 > 编程语言 > Java开发

Java 线程中sleep和wait区别

2017-11-17 00:00 190 查看
摘要: java 线程 sleep wait 区别

Thread的状态,先来看看Thread类里面都有哪几种状态(Enum Thread.State):



BLOCKED 阻塞状态,当遇到synchronized或者lock且没有取得相应的锁,就会进入这个状态
NEW 新建状态,线程创建且没有执行start方法时的状态
RUNNABLE 可运行状态,线程已经启动,但是等待相应的资源(比如IO或者时间片切换)才能开始执行
TERMINATED 终止状态,线程中断或者运行结束的状态
TIMED_WAITING 计时等待,当调用Thread.sleep()或者Object.wait(xx)或者Thread.join(xx)或者LockSupport.parkNanos或者LockSupport.partUntil时,进入该状态
WAITING 等待状态,当调用Object.wait或者Thread.join()且没有设置时间,在或者LockSupport.park时,都会进入等待状态。

接下来看sleep和wait的区别

1. sleep是Thread的一个静态(static)方法。使得Runnable实现的线程也可以使用sleep方法。而且避免了线程之前相互调用sleep()方法,引发死锁。

2. wait方法是在Object上的,而sleep方法是在Thread上,所以sleep不会释放线程的锁,wait会释放线程的锁和资源。

3. 执行时需要赋予一个沉睡时间。在沉睡期间(阻塞线程期间),CPU会放弃这个线程,执行其他任务。当沉睡时间到了之后,该线程会自动苏醒,不过此时线程不会立刻被执行,而是要等CPU分配资源,和其他线程进行竞争。

4. wait(xxx) 可以挂起线程,并释放对象的资源,等计时结束后自动恢复;wait()则必须要其他线程调用notify或者notifyAll才能唤醒。

5. wait必须放在synchronized block中,否则会在运行时报“java.lang.IllegalMonitorStateException”异常
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 多线程