- object.wait()
- thread.join()
- LockSupport.park()
我们看下使用的例子:
public class WaitThread implementsRunnable{public static Thread t1;@Overridepublic void run() {Thread t2 = new Thread(()->{try {Thread.sleep(10000);} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("Thread interrupted", e);}log.info("t1"+t1.getState().toString());});t2.start();try {t2.join();} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("Thread interrupted", e);}log.info("t2"+t2.getState().toString());}public static void main(String[] args) {t1 = new Thread(new WaitThread());t1.start();}}
在这个例子中,我们调用的t2.join(),这会使调用它的t1线程处于WAITTING状态 。我们看下输出结果:
12:44:12.958 [Thread-1] INFO com.flydean.WaitThread - t1 WAITING12:44:12.964 [Thread-0] INFO com.flydean.WaitThread - t2 TERMINATED
TIMED_WAITINGTIMED_WAITING状态表示在一个有限的时间内等待其他线程执行特定的某些操作 。java中有5中方式来达到这种状态:
- thread.sleep(long millis)
- wait(int timeout) 或者 wait(int timeout, int nanos)
- thread.join(long millis)
- LockSupport.parkNanos
- LockSupport.parkUntil
public class TimedWaitThread implementsRunnable{@Overridepublic void run() {try {Thread.sleep(5000);} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("Thread interrupted", e);}}public static void main(String[] args) throws InterruptedException {TimedWaitThread obj1 = new TimedWaitThread();Thread t1 = new Thread(obj1);t1.start();// The following sleep will give enough time for ThreadScheduler// to start processing of thread t1Thread.sleep(1000);log.info(t1.getState().toString());}}
上面的例子中我们调用了Thread.sleep(5000)来让线程处于TIMED_WAITING状态 。看下输出:
12:58:02.706 [main] INFO com.flydean.TimedWaitThread - TIMED_WAITING
那么问题来了,TIMED_WAITING和WAITTING有什么区别呢?TIMED_WAITING如果在给定的时间内没有等到其他线程的特定操作,则会被唤醒,从而进入争夺资源锁的队列,如果能够获取到锁,则会变成Runnable状态,如果获取不到锁,则会变成BLOCKED状态 。
TERMINATEDTERMINATED表示线程已经执行完毕 。我们看下例子:
public class TerminatedThread implements Runnable{@Overridepublic void run() {}public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new TerminatedThread());t1.start();// The following sleep method will give enough time for// thread t1 to completeThread.sleep(1000);log.info(t1.getState().toString());}}
输出结果:13:02:38.868 [main] INFO com.flydean.TerminatedThread - TERMINATED
【java线程的生命周期】
推荐阅读
- 一只没有翅膀的鸟 世界上有没有翅膀的鸟吗
- 如果蛆死了会不会再生蛆 蛆如果死了会不会生蛆
- 树皮石是如何做出来的 水泥假树树皮图片大全
- 海豹与寒冷海域生活相适应的结构特点是 贝加尔湖淡水海豹
- 小便排出红色线性虫子 蛔虫白色跟红色的区别
- 天文望远镜为什么是黑的 用望远镜看太阳黑子
- 目前世界发现最大的蟒蛇有多大 世界上最大的蟒蛇多长
- 让 .NET 5 开发更简单,更通用,更流行 的 开发框架
- 鲜玫瑰花茶怎么泡,玫瑰花茶怎么泡
- 玫瑰花茶的功效,揭秘玫瑰花茶功效