Java基础学习备忘录(连载之:线程的生命周期)

疑难困惑备忘录之:线程的生命周期问题。并发

  • 线程:操做系统可以进行运算调度的最小单位
  • Java线程的生命周期,即:线程的生老病死
  • 六种状态:
    • New(初始化状态)
      • 在Java层面,线程被建立了;而在操做系统中,线程实际上是还没被建立
      • 这个时候是不可能分配CPU执行这个线程的
      • 这个状态是高级语言独有的,操做系统的线程没这个状态
      • 咱们New一个线程,这时候它就是这个状态
    • Runnable(可运行/运行状态)
      • 可分配CPU执行
      • 在New状态时,调用start()方法后线程就处于这个状态
    • Blocked(阻塞状态)
      • 不能分配CPU执行的
      • 只有一种状况会致使线程阻塞,就是synchronized
      • 被synchronized修饰的方法或者代码块同一时刻只能有一个线程执行,而其余竞争锁的线程就从Runnable到了Blocked状态
      • 当某个线程竞争到锁了它就变成了Runnable状态。
      • 并发包中的Lock,是会让线程属于等待状态而不是阻塞,只有synchronized是阻塞
    • Waiting(无时间限制的等待状态)
      • 不能分配CPU执行
      • 有三种状况会使得Runnable状态到waiting状态
        1. 调用无参的Object.wait()方法
        2. 调用无参的Thread.join()方法
        3. 调用LockSupport.park()方法
    • Timed_Waiting(有时间限制的等待状态)
      • 和Waiting就是有没有超时时间的差异
      • 不能分配CPU执行的
      • 有五种状况会使得Runnable状态到waiting状态
        1. Object.wait(long timeout)
        2. Thread.join(long millis)
        3. Thread.sleep(long millis)
        4. LockSupport.parkNanos(Object blocked,long deadline)
        5. LockSupport.parkUntil(long deadline)
    • Terminated(终止状态)
      • 线程正常run结束以后或者run一半异常了就是终止状态

线程的生命周期

  • 方法Thread.stop()(已废弃,如:这个线程获得了锁,stop以后这个锁也随着没了,其它线程就都拿不到这个锁;推荐使用interrupt())是让线程终止的操作系统

  • interrupt()会使得线程Waiting和Timed_Waiting状态的线程抛出interruptedException异常,使得Runnabled状态的线程若是是在I/O操做会抛出其它异常线程

  • 若Runnabled状态的线程没有阻塞在I/O状态的话,那只能主动检测本身是否是被中断了,使用isInterrupted()。cdn

本文已收录至个人我的博客,欢迎交流:www.swaggyhang.com/blog

相关文章
相关标签/搜索