关于线程状态、阻塞操作以及中断操作的一些总结

1、线程的状态
线程有5中状态;

1、新建状态:当线程被创建时,它短暂的处于这种状态。此时他已经分配了必要的资源并进行了初始化。

2、就绪状态:在这种状态下,只要调度器把时间 片分给线程,线程就可以运行。

3、运行状态:在这种状态下,线程得到CPU时间,执行代码;

4、阻塞状态:线程可以运行,但某个条件阻止它运行。

5、死亡状态:死亡状态的线程是不可调度的。正常从run()返回,或者抛出异常。

1、关于线程状态、阻塞操作以及中断操作的一些总结
关于Java语言定义的5种线程状态:(摘自《深入理解Java虚拟机》)

1、新建状态(New):创建后尚未启动的状态

2、运行状态(Runnable):Runnable包括了操作系统线程状态中的Running和Ready,也就是说处于此状态的线程有可能正在执行,也可能正在等待CPU为它分配执行时间。

3、无限期等待(Waiting):处于这种状态的线程不会被分配给CPU时间,它们要等待被其他线程显示唤醒。

  • 没有设置Timeout参数的Object.wait()方法
  • 没有设置Timeout参数的Thread.join()方法
  • LockSupport.park()方法

4、期限等待(Timed Waiting):处于这种状态的线程不会被分配CPU时间,不过无须等待被其他线程显示的唤醒,在一定时间内他们回被系统自动的唤醒。

  • Thread.sleep()
  • 设置了Timeout参数的Object.wait()方法
  • 设置了Timeout参数的Thread.join()方法
  • LockSupport.parkNanos()方法
  • LockSupport.parkUnit()方法

5、阻塞(Blocked):在线程等待进入同步区域的时候,线程将进入这种状态。“阻塞状态”和“等待状态”的区别是:“阻塞状态”在等待获取一个排它锁,“等待状态”则是在等待一段时间或者一个唤醒动作。

6、结束(Terminated):已终止线程的线程状态。

这里列举了六种,但是《深入理解Java虚拟机》却将其称为5种状态,或许是将无限期等待和期限等待都归为了“等待状态”
也就是:新建、运行、等待、阻塞、结束这五种状态。
他们之间的转换关系为:
关于线程状态、阻塞操作以及中断操作的一些总结

2、几种方法的比较

  1. Thread.sleep(long i); 当前线程进入阻塞状态,但线程不会释放获取的锁
  2. Thread.yield();线程让出cpu时间。该方法不会导致阻塞
  3. t.join();当前线程调用其他线程的join方法,当前线程进入阻塞状态,但不会释放获取的锁。
  4. obj.wait();当前线程 释放获取的锁对象 ,当前线程进入等待队列,直到被notify()、notifyAll()唤醒或者到执行时间自动唤醒(obj.wait(long timeout));

3、关于interrupt、interrupted、isInterrupted

1、interrupt(); 方法,普通方法,一个线程调用另一个线程的interrupt()方法,另一个线程会被标志位中断状态。

2、interrupted();方法,静态方法,返回当前线程的中断状态并清除中断状态。

3、isInterrupted();方法,普通方法,返回当前线程的中断状态,但不清除。

当在线程上调用 interrupt() 时,中断发生的唯一时刻是在任务要进入到阻塞操作中,或者已经在阻塞操作内部时。