这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
线程状态概述
线程由生到死的完整过程:
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中java.lang.Thread.State
这个枚举中给出了六种线程状态:
线程状态 | 导致状态发生条件 |
---|---|
NEW(新建) | 线程刚被创建,但是并未启动。还没调用start方法。MyThread t = new MyThread只有线程对象,没有线程特征。 |
Runnable(可运行) | 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。调用了t.start()方法 :就绪(经典教法) |
Blocked(锁阻塞) | 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。 |
Waiting(无限等待) | 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。 |
Timed Waiting(计时等待) | 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait。 |
Teminated(被终止) | 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。 |
睡眠sleep方法
状态中有一个状态叫做计时等待,可以通过Thread类的方法来进行演示。public static void sleep(long time)
让当前线程进入到睡眠状态,到毫秒后自动醒来继续执行
1 | java复制代码//主线程执行到sleep方法会休眠1秒后再继续执行 |
等待和唤醒
public void wait()
: 让当前线程进入到等待状态 此方法必须锁对象调用。
1 | java复制代码public class Demo1_wait { |
public void notify()
: 唤醒当前锁对象上等待状态的线程 此方法必须锁对象调用。
1 | java复制代码public class Demo2_notify { |
等待唤醒的一个小例子
定义一个集合,包子铺线程完成生产包子,包子添加到集合中;吃货线程完成购买包子,包子从集合中移除。
- 当包子没有时(包子状态为false),吃货线程等待.
- 包子铺线程生产包子(即包子状态为true),并通知吃货线程(解除吃货的等待状态)
1 | java复制代码public class BaoZiPu extends Thread{ |
1 | java复制代码public class ChiHuo extends Thread { |
1 | java复制代码public class Demo { |
本文转载自: 掘金