面试_操作系统_线程的状态

95 阅读2分钟

线程有6个状态。

这6个状态分别是:New、Runnable、Blocked、Waiting、Timed_Waiting、Terminated。



New:这个状态呢,就是线程对象创建之后、启动之前,就是这个状态。

用代码来说呢,就是

Thread t = new Thread();
t.getState(); // New

这个New状态很好理解。



Runnable: 当调用start方法后呢,线程就会进入Runnable状态,表示,我这个线程可以被执行了,如果调度器给这个线程分配了CPU时间,那么这个线程就可以被执行,这里一定要正确区分一下Runnable不是说正在执行,而是可以被执行,这两个还是有区别的。

Thread t = new Thread();
t.getState(); // New

t.start(); // Runnable


Blocked: JVM不允许多个线程同时进入临界区,当有线程执行了临界区代码时会加一个锁,其他想来的线程就要进入Blocked状态。

Thread t = new Thread(new Runnable {
    void run() {
        synchronized (lock) { // Blocked
            // dothings
        } 
    }
});
t.getState(); // New

t.start(); // Runnable


Waiting: 当已经进入临界区后,可能在做某些事情的时候需要配合一些目前没有准备好的资源,这时候就进入wait等待状态。

Thread t = new Thread(new Runnable {
    void run() {
        synchronized (lock) { // Blocked
            // dothings
            while (!condition) {
                lock.wait(); // into Waiting
            }
        } 
    }
});
t.getState(); // New

t.start(); // Runnable


Timed_Waiting: 这个状态也是等待,但是是有一个计时器在里面,当时间达到时触发线程回到工作状态。

Thread t = new Thread(new Runnable {
    void run() {
        Thread.sleep(1000); // Timed_waiting
    }
});
t.getState(); // New

t.start(); // Runnable


Terminated: 终结状态,当线程的所有代码都被执行完毕后,会进入到这个状态,这个就是字面意思了。





线程阻塞会导致进程阻塞么?

回答这个问题,我们得了解一下线程模型

  • 多对1用户级线程模型
  • 1对1内核级线程模型
  • 多对多两级线程模型

在多对1用户级线程模型下,线程阻塞会导致所属进程阻塞。

在1对1或多对多模型下,线程阻塞不会导致进程阻塞,目前linux基本上都采用一对一模型。