操作系统的线程状态

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

image.png

  • ready:等待使用CPU,需经过系统调度
  • running:正在使用CPU
  • waiting:正在等待资源如IO,或经过等待事件调用

Java的线程状态

image.png

  1. // Thread.State 源码
  2. public enum State {
  3. NEW,
  4. RUNNABLE,
  5. BLOCKED,
  6. WAITING,
  7. TIMED_WAITING,
  8. TERMINATED;
  9. }

NEW 新建状态

  1. Thread thread = new Thread(() -> {}) //此时状态为NEW
  • 反复调用同一个线程的start()方法是否可行?
  • 假如一个线程执行完毕(此时处于TERMINATED状态),再次调用这个线程的start()方法是否可行?

start()方法必须是线程状态为0才能正常启动,否则会抛出异常。

所以两个问题的答案都是不可行,在调用一次start()之后,threadStatus的值会改变(threadStatus !=0),此时再次调用start()方法会抛出IllegalThreadStateException异常。

比如,threadStatus为2代表当前线程状态为TERMINATED。

RUNNABLE可运行状态

  1. 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终止状态

线程执行完成