线程

什么是线程

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

为什么要使用多线程

  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线程使用

参考

Java并发编程的艺术(五)——线程和线程的状态的更多相关文章

  1. Java并发编程的艺术(五)——中断

    什么是中断? 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作.因此,Java提供了一种用于停止线程的机制——中断. 中断只是一种协作机制,Java没有给中断增加任 ...

  2. Java并发编程的艺术(七)——线程间的通信

    为什么需要线程间通信 让线程之间合作,提高运行效率. volatile和synchronized关键字 实现原理 这两个方式都是采用共享内存的方式进行通信,通过同步机制保证数据可见性和排他性. 特点 ...

  3. Java并发编程的艺术(十一)——Executor与线程池

    Executor框架简介 从JDK5开始,把工作单元和执行机制分离开来了,工作的单元包括Runnable和Callable,执行机制就是由Executor框架提供. Executor两级调度模型 Ho ...

  4. Java并发编程的艺术(六)——线程间的通信

    多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...

  5. java并发编程笔记(五)——线程安全策略

    java并发编程笔记(五)--线程安全策略 不可变得对象 不可变对象需要满足的条件 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出 ...

  6. 读《Java并发编程的艺术》(一)

    离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...

  7. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...

  8. Java并发编程的艺术读书笔记(1)-并发编程的挑战

    title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- ...

  9. 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结

    <Java并发编程实战>和<Java并发编程的艺术>           Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...

  10. Java并发编程的艺术(三)——volatile

    1. 并发编程的两个关键问题 并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行:但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 ...

随机推荐

  1. 《GNU_makefile》第五章——为规则书写命令

    1. 使用make的命令行参数-n或--just-print,make会只显示要执行的命令,不执行,这样方便调试makefile. 2.执行命令 每写一行命令,make会fork出一个shell进程来 ...

  2. python pip install指定国内源镜像

    有时候安装一些依赖包,网不好,直接超时,或者这个包就是死都下不下来的时候,可以指定国内源镜像. pip install -i 国内镜像地址 包名 e.g. pip install -i  http:/ ...

  3. Mon失效处理方法

    假设环境为三个mon,主机名为mon1.mon2.mon3,现在mon3上面的系统盘损坏,mon的数据完全丢失,现在需要对mon3进行恢复处理 1.停止所有mon进程,可以不停其他进程,需要停止内核客 ...

  4. Git-commit与回滚

    # 提交-信息 git commit -m "message" git commit -a -m "message" // 等同于 git add . & ...

  5. 每天一个linux命令之top

    每天一个linux命令之top 转  https://www.linuxprobe.com/chapter-02.html 在图2-6中,top命令执行结果的前5行为系统整体的统计信息,其所代表的含义 ...

  6. 交换机通过Loopback Detection检测(设备所在网络环路)

    组网图形  Loopback Detection简介 见上篇文章(详情见),不再赘述. 组网需求 如图1所示,某小型企业采用二层组网,所属VLAN为100.由于人员流动性大,网络拓扑变动频繁,变动往往 ...

  7. word边框+底纹

    边框(段落和文字):先进行方框.阴影.三维等边框的选择,再进行样式.颜色.宽度设置,应用于:段落和文字:选项:距离正文上下左右距离. 页面边框(页.整篇文章等):先进行方框.阴影.三维等边框的选择,再 ...

  8. 【基于Puppeteer前端自动化框架】【二】PO模式,断言(如何更简便逻辑的写测试代码)

    一.概要 前面介绍了Puppeteer+jest+TypeScript做UI自动化,但是这知识基础的,我们实现自动化要考虑的很多,比如PO模式,比如配置文件,比如断言等等.下面就来一一实现我是怎么用p ...

  9. centos 7 安装zabbix-4.0

    第一步:安装nginx ############安装Nginx###########yum localinstall http://nginx.org/packages/centos/7/noarch ...

  10. api-hook,更轻量的接口测试工具

    前言 在网站的开发过程中,接口联调和测试是至关重要的一环,其直接影响产品的核心价值,而目前也有许多技术方案和工具加持,让我们的开发测试工作更加便捷.接口作为数据传输的重要载体,数据格式和内容具有多样性 ...