线程

什么是线程

操作系统调度的最小单元就是线程,也叫轻量级进程。

为什么要使用多线程

  1. 多线程程序能够更有效率地利用多处理器核心。
  2. 用户响应时间更快。
  3. 方便程序员将程序模型映射到Java提供的多线程编程模型上。

线程的状态

1. 初始态 NEW

线程被构建,但是还没有调用start()方法调用。

2 运行态 RUNNABLE

运行态又分为就绪态和运行态:

  • 就绪态:该状态下线程已经具备执行所需要的所有资源,只等CPU分配执行权就能运行。所有的就绪态线程都排在就绪队列中。
  • 运行态:获取CPU执行权的正在执行的线程。每个CPU同时只有一条运行态的线程。

3.阻塞态

表示线程阻塞于锁。

  • 当线程请求一个资源失败的时候,就会进入阻塞态。Java中阻塞态就是指线程获取锁失败后进入的状态。是被动进入的。
  • 所有阻塞态的线程被排在阻塞队列当中。
  • 处于阻塞态的线程会不断请求资源,当请求成功的时候,就会又进入就绪队列等待执行。

4.等待态

  • 当前线程中调用wait join park时,线程就会进入等待态。
  • 等待态的线程放在等待队列中。
  • 需要又其他线程的唤醒才行。
  • 会释放资源。

5.超时等待态

  • 当线程中调用sleep wait join parkNanos parkUntil时,就是让线程进入等待态。
  • 与等待态不同,不是因为请求不到资源,这是主动进入的,需要其他线程对其进行唤醒。
  • 等待态的线程没有CPU执行权和占有资源。
  • 到了超时时间后进入阻塞队列,开始竞争锁。

6.终止态

线程执行结束后的状态。

线程状态转换

  • 初始态 ——> 就绪态
    当调用线程对象的start()方法就会进入就绪态。当就绪态队列中没有线程,那就直接进入运行态。
  • 就绪态 ——> 运行态
    由系统调度。
  • 运行态 ——> 就绪态
    调用Thread.yield()函数 或者 系统调度完成。
  • 运行态 ——> 阻塞态
    线程获取锁失败。
  • 阻塞态 ——> 就绪态
    获取到锁。
  • 运行态 ——> 等待态
    调用Object.wait() 方法,其调用必须是在同步块内部由同步块的锁对象调用。
    调用Thread.join() LockSupport.part() 方法。
  • 等待态 ——> 就绪态
    锁对象被调用了Object.notify() 方法,并且等待的线程不需要锁。
    还有Object.notifyAll() LockSupport.unpark(Tread) 方法。
  • 等待态 ——> 阻塞态
    锁对象 notify的时候,被等地啊线程还需要锁同步。

知识点

  • wait方法会释放CPU的执行权和占有的锁。
  • sleep方法会释放CPU的使用权,但是任然占有锁;线程被放入超时等待队列,它会使线程较长时间得不到运行。
  • wait和notify必须配套使用,必须使用同一把锁。
  • wait和notify必须放在一个同步块中。
  • notify和notifyAll的区别在于,前者只唤醒等待队列中的一个线程,而后者是所有线程。

Daemon 线程

作用

是一种支持型线程,主要用作程序中后台调度和支持性共工作。

如果一个Java虚拟机中不存在非Deamon线程的时候,Java虚拟机就会退出,因为不会再有任务了呀。

Java线程使用

参考

最新文章

  1. 循环冗余码crc
  2. oracle 12c中的隐含列
  3. LeetCode() 数字1的个数
  4. Neo4j图数据库管理系统开发笔记之二:管理系统Server端界面一览
  5. Beta版本的贡献率
  6. cocos2dx 3.x(点击屏幕移动精灵,拖动精灵)不需要写回调函数Lua表达式
  7. mybatis 打印 sql
  8. 未知宽高div水平垂直居中3种方法
  9. Arduino当avr开发板
  10. Hbase的常见shell操作
  11. IDEA调试技巧之条件断点
  12. 基本够用的php.ini配置文件(CentOS7)
  13. 使用FreeRTOS在SD卡驱动使用非系统延时导致上电重启不工作的情况
  14. BZOJ1297 [SCOI2009]迷路 矩阵乘法
  15. Webpack+React项目入门——入门及配置Webpack
  16. [国际A类会议] 2018最最最顶级的人工智能国际峰会汇总!CCF推荐!
  17. 2019 rode of my LeetCode
  18. git报错:Pull is not possible because you have unmerged files解决方法
  19. Python——列表的操作
  20. ts 绘制多边形

热门文章

  1. idea开发工具下,进行多个线程切换调试
  2. 希捷powerchoice磁盘休眠功能配置方法
  3. cephfs元数据池故障的恢复
  4. 不小心清空了Ceph的OSD的分区表如何恢复
  5. ntpd配置时间同步服务器
  6. SQL Server数据库Union和Union All查询出数据的区别?
  7. C#高级编程之反射
  8. Linux Shell操作 执行C代码显示当前路径
  9. Java 中常见的细粒度锁实现
  10. H5时代leaflet中还在用DivIcon?