Java线程的状态

标签: java 线程 状态 | 发表时间:2015-09-24 23:53 | 作者:xiangshimoni
出处:http://blog.csdn.net

线程一般会有多种状态,Java的状态有:
- NEW
- RUNNABLE
- BLOCKED
- WAITING
- TIMED_WAITING
- TERMINATED

对于各个状态的含义,直接看Thread.java中的源码注释:

  public enum State {
        /**
         * Thread state for a thread which has not yet started.
         * 还没有启动的线程状态,比如只定义了一个线程,没有调用strat()方法
         */
        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.
         * 现在在JVM中正在执行,但是需要等待其他资源比如处理器资源,这时候所处的状态
         */
        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}.
         * 线程等待监视器锁的状态,线程可能等待进入同步块/方法时或者调用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.
         * 线程等待状态。可能因为调用Object.wait没有超时,Thread.join没有超时,
         * LockSupport.park。
         * 线程等待状态是正在等待另一个线程执行特定操作。
         */
        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>
         * 线程等待特定的时间。调用了sleep,或者带超时的Object.wait,带超时的join,
         * LockSupport的parkNanos或parkUntil等
         */
        TIMED_WAITING,

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         * 结束的线程
         */
        TERMINATED;
    }

这几种状态,可以写程序测试一下:

      Thread thread1 = new Thread(new Runnable() {

        @Override
        public void run() {
        System.out.println("thread 1");
        }
    });

    System.out.println("state: "+thread1.getState());

输出:

state: NEW

      Thread thread1 = new Thread(new Runnable() {

        @Override
        public void run() {
        System.out.println("thread 1");
        }
    });

    System.out.println("state: "+thread1.getState());
    thread1.start();
    System.out.println("state: "+thread1.getState());

输出:

state: NEW
state: RUNNABLE
thread 1

生产者-消费者模型中,生产者速度没有消费者快导致没有足够可消费物品时,消费者就会等待:

      final Object lock = new Object();
    Thread t1 = new Thread() {
        @Override
        public void run() {

        int i = 0;

        while (true) {
            synchronized (lock) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                }
                    System.out.println(i++);
                }
            }
        }
    };

    t1.start();
    System.out.println("state: " + t1.getState());

输出:

state: WAITING

      final Object lock = new Object();
    Thread t1 = new Thread() {
        @Override
        public void run() {

        int i = 0;

        while (true) {
            synchronized (lock) {
            try {
                lock.wait(20 * 1000L);
            } catch (InterruptedException e) {
            }
            System.out.println(i++);
            }
        }
        }
    };

    t1.start();
    Thread.sleep(1000);
    System.out.println("state: " + t1.getState());

输出:

state: TIMED_WAITING

  public class BlockTest {

    final Object lock = new Object();

    public BlockTest() {

    }

    public void test(){
    synchronized(lock){
        while(true){

        }
    }
    }

    public void run() throws InterruptedException{
    Runnable r = new Runnable() {

        @Override
        public void run() {
        test();
        }
    };
    Thread t1 = new Thread(r);
    Thread t2 = new Thread(r);
    t1.start();
    Thread.sleep(1000);
    t2.start();
    System.out.println("thread1: "+t1.getState());
    System.out.println("thread2: "+t2.getState());
    }
}

输出:

thread1: RUNNABLE
thread2: BLOCKED

      Thread t1 = new Thread(new Runnable() {

        @Override
        public void run() {
        System.out.println("thread 1 running");
        }
    });
    t1.start();
    Thread.sleep(1000);
    System.out.println("thread1 :"+t1.getState());

输出:

thread 1 running
thread1 :TERMINATED

作者:xiangshimoni 发表于2015/9/24 15:53:15 原文链接
阅读:24 评论:0 查看评论

相关 [java 线程 状态] 推荐:

Java线程的状态

- - CSDN博客推荐文章
线程一般会有多种状态,Java的状态有:. 对于各个状态的含义,直接看Thread.java中的源码注释:. * 还没有启动的线程状态,比如只定义了一个线程,没有调用strat()方法. * 现在在JVM中正在执行,但是需要等待其他资源比如处理器资源,这时候所处的状态. * 线程等待监视器锁的状态,线程可能等待进入同步块/方法时或者调用Object.wait().

java线程5种状态[转]

- - 企业架构 - ITeye博客
转:http://blog.csdn.net/yaolingrui/article/details/7522372. Java中的线程的生命周期大体可分为5种状态. ①NEW:这种情况指的是,通过New关键字创建了Thread类(或其子类)的对象. ②RUNNABLE:这种情况指的是Thread类的对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于RUNNABLE状态时并没有运行完自己的run方法,时间片用完之后回到RUNNABLE状态;还有种情况就是处于BLOCKED状态的线程结束了当前的BLOCKED状态之后重新回到RUNNABLE状态.

线程的生命周期 - 理解Java中线程的状态

- - CSDN博客推荐文章
    如果你在工作中需要使用到线程,或是需要在多线程环境下编程,那么了解 线程的生命周期(Life Cycle of Thread)以及 线程的状态(Thread States)是很有必要的.     正如我们在上一篇文章中了解到的,通过实现Runnable接口或是继承Thread类,我们可以创建一个 Java线程类.

Java线程池

- - 企业架构 - ITeye博客
线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的. 在jdk1.5之后这一情况有了很大的改观. Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用. 为我们在开发中处理线程的问题提供了非常大的帮助.

Java 线程池

- - 编程语言 - ITeye博客
在项目中,系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互. 在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存周期很短的线程时,更应该考虑使用线程池. 使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过此数.

Java Thread多线程

- - CSDN博客推荐文章
Java Thread多线程. Java 多线程例子1 小例子. super("zhuyong");//设置线程的名字,默认为“TestThread”. Java 多线程例子2 前台线程(用户线程) 后台线程(守护线程 ). 1,setDaemon(true)后就是后台线程(守护线程 ),反之就是前台线程(用户线程).

Java线程之FutureTask

- - zzm
FutureTask是Future和Callable的结合体. 然后通过Future来取得计算结果. 但是,若开启了多个任务,我们无从知晓哪个任务最先结束,因此,若要实现“当某任务结束时,立刻做一些事情,例如记录日志”这一功能,就需要写一些额外的代码. FutureTask正是为此而存在,他有一个回调函数protected void done(),当任务结束时,该回调函数会被触发.

[Java] Java 多线程案例分析

- - V2EX
现要从 hbase中导出 2016 年整年的,大约 10w只股票行情数据,数据总量约 100t. 汇总到 hdfs中供需求方使用. 已知数据量规模大概是 100t,那么单台机器处理肯定不是不行的,先不说大多数磁盘都没这么大,即便磁盘有这么大,单台机器处理对于内存和 cpu 要求也很高,所以我们将问题一般化,使用数量有限的低配机器.

Java多线程之synchronized

- - CSDN博客推荐文章
这里通过三个测试类阐述了synchronized应用的不同场景. 首先是最基本的synchronized Method的使用.  * @see 概述:Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor) .  * @see 说明:当synchronized关键字修饰一个方法时,则该方法为同步方法 .

java线程池分析

- - BlogJava-首页技术区
    在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成. 5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务.