操作系统的线程状态
在现在的操作系统中,线程是被视为轻量级进程的,所以操作系统线程的状态其实和操作系统进程的状态是一致的

- ready:等待使用CPU,需经过系统调度
- running:正在使用CPU
- waiting:正在等待资源如IO,或经过等待事件调用
Java的线程状态

// Thread.State 源码public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;}
NEW 新建状态
Thread thread = new Thread(() -> {}) //此时状态为NEW
- 反复调用同一个线程的start()方法是否可行?
- 假如一个线程执行完毕(此时处于TERMINATED状态),再次调用这个线程的start()方法是否可行?
start()方法必须是线程状态为0才能正常启动,否则会抛出异常。
所以两个问题的答案都是不可行,在调用一次start()之后,threadStatus的值会改变(threadStatus !=0),此时再次调用start()方法会抛出IllegalThreadStateException异常。
比如,threadStatus为2代表当前线程状态为TERMINATED。
RUNNABLE可运行状态
thread.start() //执行start后的状态
start()和run()的区别
调用 start 方法方可启动线程并使线程进入就绪状态,会交由JVM调用该线程的run()
而 run 方法只是 thread 的一个普通方法调用,还是在主线程里执行
BLOCKED阻塞状态
处于BLOCKED状态的线程正等待锁的释放以进入同步区
WAIT等待状态
处于等待状态的线程变成RUNNABLE状态需要其他线程唤醒,唤醒后也可能从RUNNABLE变为BLOCKED状态
- Object.wait()
- Thread.join()
锁与CPU时间片的区别
- 首先sleep不能释放锁,wait可以释放锁
- 但两者都能释放CPU
1、一般锁是指对象锁,一个线程占有一个对象的锁以后,CPU时间片资源仍然能被其它线程抢走。
2、当其他线程抢走CPU资源后,发现获取不到对象锁,则此线程会进入阻塞状态,可能会进入由于获取不到锁而阻塞的阻塞队列中(看是否用到阻塞队列)。
3、当占有锁的线程释放对象锁的时候,就会立即唤醒等待对象锁的其他线程(这里需要调用notify()唤醒)
TIME_WAIT计时等待状态
基本同WAITING状态,除了加入了超时时间
- Thread.sleep(time)
- Object.wait(time)
- Thread.join(time)
TERMIATED终止状态
线程执行完成
