线程有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基本上都采用一对一模型。