多线程六种状态

哪些状态

  • 新建(New)
  • 可运行(Runnable)
  • 阻塞(Blocked)
  • 等待(Waiting)
  • 计时等待(Timed waiting)
  • 终止(Terminated)

如图所示:

21312321.png

状态分析

新建状态

 我们在创建一个线程的时候,如new Thread(),这个线程只是创建完毕,但是还没有开始运行线程中的代码,这时它的状态是 新建(New),在执行线程之前还需要一些其它的事情没有完成。我们可以通过Thread.getState()方法获取线程状态。

代码如下:

public class MyThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyThread());
        System.out.println( thread.getState() );
    }
}

class MyThread implements Runnable{

    @Override
    public void run() {
        System.out.println("线程");
    }
}

// 输出结果
NEW
可运行状态

 线程创建完毕后,一旦调用了start()方法,线程就处于可运行的状态。一个 可运行 的线程可以是正在运行也可以是还没有运行。这得由操作系统来分配cpu时间片。

 一个线程开始运行后,它的状态不一定一直都是运行状态。也有可能需要这个线程暂停一下,给其它线程执行的机会。

 由于目前的cpu大多数都是多核的,可以同时运行多个线程,但是如果线程数超过多核数量就需要调度器来分配cpu时间片了,只有获取cpu时间片的线程才能正常运行,如果一个线程的cpu时间片用完。操作系统会剥夺这个线程的运行权并给另外一个线程运行的机会。而这个被剥夺运行的线程会进入下一次分配cpu时间片的过程中。

代码如下

public class MyThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyThread());
        thread.start();
        System.out.println( thread.getState() );
    }
}

class MyThread implements Runnable{

    @Override
    public void run() {
        System.out.println("线程");
    }
}
// 输出结果
RUNNABLE
线程
阻塞状态 and 等待状态

 当线程处于阻塞或等待状态时,这个线程时不活动的。它不运行任何代码,消耗最少的资源。由线程调度器重新激活这个线程才可以继续运行。

  • 当一个线程试图获取一个内部的对象锁,而这个锁被其它线程占用,则这个线程就会进入阻塞状态。当其它线程都释放这个锁,并且线程调度器允许另一个线程持有这个锁的时候,它将变成非阻塞状态。

  • 当线程等待另一个线程通知调度器出现一个条件时,这个线程就会进入等待状态。实际上线程阻塞状态和线程等待状态没有太大的区别。

  • 在java线程中有几个超时参数,调用这些方法会让线程进入计时等待状态。

终止状态

线程会终止时由于以下两个原因之一而终止:

  • run方法正常退出,线程自然终止。
  • 因为一个没有捕获的异常而终止run方法,使线程意外终止。
# 多线程 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×