线程是JAVA中绕不过去的一个话题,今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发 。
java中Thread的状态java中Thread有6种状态,分别是:
- NEW - 新创建的Thread,还没有开始执行
- RUNNABLE - 可运行状态的Thread,包括准备运行和正在运行的 。
- BLOCKED - 正在等待资源锁的线程
- WAITING - 正在无限期等待其他线程来执行某个特定操作
- TIMED_WAITING - 在一定的时间内等待其他线程来执行某个特定操作
- TERMINATED - 线程执行完毕
文章插图
JDK代码中的定义如下:
public enum State {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread state for a runnable thread.A thread in the runnable* state is executing in the Java virtual machine but it may* be waiting for other resources from the operating system* such as processor.*/RUNNABLE,/*** Thread state for a thread blocked waiting for a monitor lock.* A thread in the blocked state is waiting for a monitor lock* to enter a synchronized block/method or* reenter a synchronized block/method after calling* {@link Object#wait() Object.wait}.*/BLOCKED,/*** Thread state for a waiting thread.* A thread is in the waiting state due to calling one of the* following methods:* <ul>*<li>{@link Object#wait() Object.wait} with no timeout</li>*<li>{@link #join() Thread.join} with no timeout</li>*<li>{@link LockSupport#park() LockSupport.park}</li>* </ul>** <p>A thread in the waiting state is waiting for another thread to* perform a particular action.** For example, a thread that has called <tt>Object.wait()</tt>* on an object is waiting for another thread to call* <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on* that object. A thread that has called <tt>Thread.join()</tt>* is waiting for a specified thread to terminate.*/WAITING,/*** Thread state for a waiting thread with a specified waiting time.* A thread is in the timed waiting state due to calling one of* the following methods with a specified positive waiting time:* <ul>*<li>{@link #sleep Thread.sleep}</li>*<li>{@link Object#wait(long) Object.wait} with timeout</li>*<li>{@link #join(long) Thread.join} with timeout</li>*<li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>*<li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>* </ul>*/TIMED_WAITING,/*** Thread state for a terminated thread.* The thread has completed execution.*/TERMINATED;}
NEWNEW 表示线程创建了,但是还没有开始执行 。我们看一个NEW的例子:public class NewThread implements Runnable{public static void main(String[] args) {Runnable runnable = new NewThread();Thread t = new Thread(runnable);log.info(t.getState().toString());}@Overridepublic void run() {}}
上面的代码将会输出:NEW
RunnableRunnable表示线程正在可执行状态 。包括正在运行和准备运行两种 。为什么这两种都叫做Runnable呢?我们知道在多任务环境中,CPU的个数是有限的,所以任务都是轮循占有CPU来处理的,JVM中的线程调度器会为每个线程分配特定的执行时间,当执行时间结束后,线程调度器将会释放CPU,以供其他的Runnable线程执行 。
我们看一个Runnable的例子:
public class RunnableThread implements Runnable {@Overridepublic void run() {}public static void main(String[] args) {Runnable runnable = new RunnableThread();Thread t = new Thread(runnable);t.start();log.info(t.getState().toString());}}
上面的代码将会输出:RUNNABLE
BLOCKEDBLOCKED表示线程正在等待资源锁,而目前该资源正在被其他线程占有 。我们举个例子:
public class BlockThread implements Runnable {@Overridepublic void run() {loopResource();}public static synchronized void loopResource() {while(true) {//无限循环}}public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new BlockThread());Thread t2 = new Thread(new BlockThread());t1.start();t2.start();Thread.sleep(1000);log.info(t1.getState().toString());log.info(t2.getState().toString());System.exit(0);}}
上面的例子中,由于t1是无限循环,将会一直占有资源锁,导致t2无法获取资源锁,从而位于BLOCKED状态 。我们会得到如下结果:
12:40:11.710 [main] INFO com.flydean.BlockThread - RUNNABLE12:40:11.713 [main] INFO com.flydean.BlockThread - BLOCKED
WAITINGWAITING 状态表示线程正在等待其他的线程执行特定的操作 。有三种方法可以导致线程处于WAITTING状态:
推荐阅读
- 一只没有翅膀的鸟 世界上有没有翅膀的鸟吗
- 如果蛆死了会不会再生蛆 蛆如果死了会不会生蛆
- 树皮石是如何做出来的 水泥假树树皮图片大全
- 海豹与寒冷海域生活相适应的结构特点是 贝加尔湖淡水海豹
- 小便排出红色线性虫子 蛔虫白色跟红色的区别
- 天文望远镜为什么是黑的 用望远镜看太阳黑子
- 目前世界发现最大的蟒蛇有多大 世界上最大的蟒蛇多长
- 让 .NET 5 开发更简单,更通用,更流行 的 开发框架
- 鲜玫瑰花茶怎么泡,玫瑰花茶怎么泡
- 玫瑰花茶的功效,揭秘玫瑰花茶功效