线程状态流转

线程状态在Thread.java里的State枚举里定义了六种
NEW:new Thread() 但尚未启动
RUNABLE:new Thread().start()后现在会进入就绪状态,等待分配CPU即可执行
BLOCKED:被阻塞状态,线程正在获取锁。线程A想获取对象锁a,但是对象锁a已经被其他线程B占有了,而造成当前线程A被阻塞在获取锁a的阶段,A会进入锁a的锁池中,等锁a被释放时,会在锁池中选一个线程获取锁a。
WATING:等待状态是线程整等待通知被唤醒,进入原因三个:Object.wati()/Thread.join()/LockSupport.park()。t1.wait()需要其他线程执行t1.notify()/t1.notifyAll()才能唤醒;t2.join()需要等待t2执行完,当前线程才能唤醒。
TIME_WAITING:限时等待,有五种方法可以进入:Thread.sleep(1000)/Object.wait(1000)/Thread.join(1000)/LockSupport.parkNanos(1000)/LockSupport.parkUntil(1000),超过等待时间会自动进入就绪状态。
TERMINATED:线程执行结束或者报异常则结束。

sleep与wait的区别

sleep到时间后会自动进入就绪状态,wait需要其他线程调用notify/notifyAll才能唤醒。sleep不会释放锁,所以到时见后可以直接就绪;wait会释放锁,唤醒后需要再次拿到锁才能执行。

sleep与yield的区别

两者都会放弃CPU占用,sleep可以交给优先级的线程,yield可以交给优先级相同的线程。

释放锁

wait()/join()

不释放锁

sleep()/yield()

你可能感兴趣的:(线程状态流转)