09 | Java线程(上):Java线程的生命周期

Java线程生命周期

java线程6种状态:

(1)New(初始化状态)
(2)RUNNABLE(可运行/运行状态)
(3)BLOCKED(阻塞状态)
(4)WAITING(无限时等待)
(5)TIMED_WAITING(有限时等待)
(6)TERMINATED(终止状态)


09 | Java线程(上):Java线程的生命周期_第1张图片
image

1.RUNNABLE与BLOCKED的状态转换

(1)线程调用阻塞式 API 时,是否会转换到 BLOCKED 状态?

在操作系统层面,线程是会转换到休眠状态的,但是在 JVM 层面,Java 线程的状态还是RUNNABLE
JVM 层面并不关心操作系统调度相关的状态,因为在 JVM看来,等待 CPU 使用权(操作系统层面此时处于可执行状态)与等待 I/O(操作系统层面此时处于休眠状态)没有区别,都是在等待某个资源,所以都归入了 RUNNABLE 状态。
ps:I/O阻塞在Java中是可运行状态,并发包中的lock是等待状态。
sleep、join等会抛出InterruptedException的操作会立即抛出异常,wait在被唤醒之后才会抛出异常(就像阻塞一样,不被打扰)。

2. RUNNABLE 与 WAITING 的状态转换

(1)synchronized内object.wait()
(2)Thread.join
(3)LockSupport.park()

3. RUNNABLE 与 TIMED_WAITING 的状态转换

4. 从 NEW 到 RUNNABLE 状态

创建线程后调用start()

5. 从 RUNNABLE 到 TERMINATED 状态

(1)线程执行完
(2)interrupt()
stop()和interrupt()区别?

stop()会杀死线程,如果线程持有锁也不会释放掉。
interrupt()仅仅是通知线程,线程有机会执行后续操作。被interrupt()的
线程可以通过异常或者主动检测收到通知。
当线程 A 处于 WAITING、TIMED_WAITING 状态时,如果其他线程调用线程 A 的 interrupt( 方法,会使线程 A 返回到 RUNNABLE 状态,同时线程 A 的代码会触发 InterruptedException异常。

思考:

下面代码的本意是当前线程被中断之后,退出while(true),你觉得这段代码是否正确呢?

Thread th = Thread.currentThread();
while(true) {
  if(th.isInterrupted()) {
    break;
  }
  // 省略业务代码无数
  try {
    Thread.sleep(100);
  }catch (InterruptedException e){
    e.printStackTrace();
  }
}

答:不对。假设在sleep期间抛出了异常,此时interrupt标志会被清除,重新循环的时候判断isInterrupted()就是false了。应该重新设置一下中断标志,如下:

Thread th = Thread.currentThread();
while(true) {
  if(th.isInterrupted()) {
    break;
  }
  // 省略业务代码无数
  try {
    Thread.sleep(100);
  }catch (InterruptedException e){
    Thread.currentThread().interrupt();
    e.printStackTrace();
  }
}

或者也可以将捕获异常放在while循环外面。

你可能感兴趣的:(09 | Java线程(上):Java线程的生命周期)