多线程编程-- part 2 线程的生命周期和优先级

时间:2023-03-09 09:47:26
多线程编程-- part 2 线程的生命周期和优先级

线程的创建到消亡的历程:

多线程编程-- part 2 线程的生命周期和优先级

java多线程的5种状态:

(1)New(新建)

  new Thread(run()) 该线程还没开始运行,状态是new,在程序运行前还有一些基础工作要做

(2)runnable(就绪)

  一旦调用start()方法,线程就处于runnable状态,可运行的线程可能正在运行,也可能没有运行,取决于操作系统给线程的时间片,放在可运行线程池中,等待CPU的使用权

(3)Blocked(阻塞)

  阻塞状态是线程因为某种原因放弃了CPU使用权,暂时停止运行,直到线程进入就绪状态。阻塞情况分三种:

  1.等待状态:运行状态线程执行wait()方法,JVM把该线程放入等待池中

  2.同步阻塞:线程获取对象的同步锁,锁被别的线程占用,JVM把线程放入锁池中

  3.其他阻塞:线程执行sleep,join,或者发出I/O请求,JVM把线程置为阻塞状态,sleep超时,join等待线程终止或超时,或者I/O处理完毕,线程重新进入就绪状态

(4)running(运行)

  就绪状态线程获取CPU时间片,开始执行代码

(5)dead(死亡)

  线程run(),main()方法执行完毕结束,或者因异常退出了run()方法,则该线程结束生命周期,死亡的线程不可再次复生。

多线程编程-- part 2 线程的生命周期和优先级

线程的优先级:

  线程的优先级是为了在多线程环境便于系统对线程的调度,优先级高的线程优先执行,但是不能依靠线程的优先级来决定线程的执行顺序。

  线程创建时,子继承父的优先级,可通过setPriority()方法改变优先级,默认值是5,范围1-10

线程调度策略:

  线程调度器会选择优先级更高的线程运行,但是发生以下情况,会终止线程的运行:

(1)调用yield()方法,让出了对CPU的占用

(2)调用了sleep()方法

(3)线程进行I/O操作而受阻

(4)另一个更高优先级的线程出现

(5)该线程的时间片用完