Thread的状态,先来看看Thread类里面都有哪几种状态(Enum Thread.State):java
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会释放线程的锁和资源。it
3. 执行时须要赋予一个沉睡时间。在沉睡期间(阻塞线程期间),CPU会放弃这个线程,执行其余任务。当沉睡时间到了以后,该线程会自动苏醒,不过此时线程不会马上被执行,而是要等CPU分配资源,和其余线程进行竞争。io
4. wait(xxx) 能够挂起线程,并释放对象的资源,等计时结束后自动恢复;wait()则必需要其余线程调用notify或者notifyAll才能唤醒。方法
5. wait必须放在synchronized block中,不然会在运行时报“java.lang.IllegalMonitorStateException”异常im