java线程的生命周期

线程是JAVA中绕不过去的一个话题,今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发 。
java中Thread的状态java中Thread有6种状态,分别是:

  1. NEW - 新创建的Thread,还没有开始执行
  2. RUNNABLE - 可运行状态的Thread,包括准备运行和正在运行的 。
  3. BLOCKED - 正在等待资源锁的线程
  4. WAITING - 正在无限期等待其他线程来执行某个特定操作
  5. TIMED_WAITING - 在一定的时间内等待其他线程来执行某个特定操作
  6. TERMINATED - 线程执行完毕
我们可以用一个图来直观的表示:
java线程的生命周期

文章插图
 
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() {}}上面的代码将会输出:
NEWRunnableRunnable表示线程正在可执行状态 。包括正在运行和准备运行两种 。
为什么这两种都叫做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());}}上面的代码将会输出:
RUNNABLEBLOCKEDBLOCKED表示线程正在等待资源锁,而目前该资源正在被其他线程占有 。
我们举个例子:
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 - BLOCKEDWAITINGWAITING 状态表示线程正在等待其他的线程执行特定的操作 。有三种方法可以导致线程处于WAITTING状态:


推荐阅读