史上最全的多线程概述

进程:资源的分配和调度的一个独立单元

线程:CPU调度的基本单元,存在于进程中,比如微信要接受消息,发送消息,这些子任务就是线程。

联系:同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。

Http请求的线程形式:

http请求,到业务处理,再到响应的过程,是在一个线程里面的。一个线程由一个方法启动,但是一个线程里面可以有多个线程,并不是每个方法都是一个线程,只有当启动线程结束时,该线程才终止。 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。tomcat会维护一个线程池,每一个http请求,会从线程池中取出一个空闲线程。默认初始化75个线程,可以进行修改。

java线程调度:

线程调度是指系统为线程分配处理器使用权的过程,主要调度方式分两种,分别是协同式线程调度和抢占式线程调度。 

协同式线程调度:线程执行时间由线程本身来控制,线程把自己的工作执行完之后,要主动通知系统切换到另外一个线程上。最大好处是实现简单,且切换操作对线程自己是可知的,没啥线程同步问题。坏处是线程执行时间不可控制,如果一个线程有问题,可能一直阻塞在那里。 

抢占式调度:每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定(Java中,Thread.yield()可以让出执行时间,但无法获取执行时间)。线程执行时间系统可控,也不会有一个线程导致整个进程阻塞。 

Java线程调度就是抢占式调度。 

希望系统能给某些线程多分配一些时间,给一些线程少分配一些时间,可以通过设置线程优先级来完成。Java语言一共10个级别的线程优先级,在两线程同时处于ready状态时,优先级越高的线程越容易被系统选择执行。但优先级并不是很靠谱,因为Java线程是通过映射到系统的原生线程上来实现的,所以线程调度最终还是取决于操作系统。

补充:

1. 中央处理器,是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。 它的工作,主要是解释计算机中的指令,和处理计算机软件中的数

据。它在计算机中起着最重要的作用,构成了系统的控制中心,对各个应用程序进行统一协调和控制。

2. java线程只能抢占cpu的执行权,但是无法控制执行时间,即当一个线程在执行某一方式时,即使该方法没有执行完,也即该线程没有执行完,但是系统分配给该线程的执行时间已经到了,这时该线程独立的程序计数器,会存储虚拟机字节码指令地址,当该线程重新获取cpu执行权时,将不会重新开始执行线程的所有方法,而是会从该线程中的程序计数器中获取字节码指定地址,然后从这里开始继续执行。

3. 线程在执行I/O时,只有在开始或者结束时需要cpu做一定处理,在执行I/O程序期间,是不需要cpu干预的,换言在,即程序在进行I/O操作时,JVM会将该线程设置为阻塞状态,当I/O处理完毕时,线程会重新转入就绪状态。

 

单核cpu和多核cpu:

  • 都是一个cpu,不同的是每个cpu上的核心数
  • 多核cpu是多个单核cpu的替代方案,多核cpu减小了体积,同时也减少了功耗
  • 一个核心只能同时执行一个线程
  • 所谓的4核8线程,4核指的是物理核心。通过超线程技术,用一个物理核模拟两个虚拟核,每个核两个线程,总数为8线程。在操作系统看来是8个

核,但是实际上是4个物理核。通过超线程技术可以实现单个物理核实现线程级别的并行计算,但是比不上性能两个物理核。

 

线程切换:

  • cpu给线程分配时间片(也就是分配给线程的时间),执行完时间片后会切换都另一个线程。
  • 切换之前会保存线程的状态,下次时间片再给这个线程时才能知道当前状态。
  • 从保存线程A的状态再到切换到线程B时,重新加载线程B的状态的这个过程就叫上下文切换。
  • 而上下切换时会消耗大量的cpu时间。

 

线程开销:

  • 上下文切换消耗
  • 线程创建和消亡的开销
  • 线程需要保存维持线程本地栈,会消耗内存

 

多线程的优点:

1. 使用线程可以把占据时间长的程序中的任务放到后台去处理

2. 用户界面更加吸引人,这样比如用户点击了一个按钮去触发某件事件的处

理,可以弹出一个进度条来显示处理的进度

3. 程序的运行效率可能会提高

4. 在一些等待的任务实现上如用户输入,文件读取和网络收发数据等,线程就

比较有用了.

 

多线程的缺点:

1. 如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换.

2. 更多的线程需要更多的内存空间

3. 线程中止需要考虑对程序运行的影响.

4. 通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生

 

线程的生命周期:

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方

法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用

权。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时

停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分

三种:

(一)等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待中。

(二)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程

占用,则JVM会把该线程放入锁池中。

(三)其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求

时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程

终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

resume(),suspend(),stop()方法已经过时了,舍弃不用

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录回到顶部↑ 第1篇 vb2008基础知识 第1章 visualbasic2008.net入门2 1.1.netframework概述2 1.2 visualbasic2008.net的新特性3 1.3 安装vs2008.net4 1.3.1 vs2008.net系统软硬件要求4 1.3.2 vs2008.net安装步骤4 1.4 vb2008.net集成开发环境7 1.4.1 ide启动界面7 1.4.2 主体窗口界面介绍8 1.4.3 窗口菜单作用9 1.4.4 主要开发类窗口10 1.4.5 动态帮助13 1.5 我的第一个.net应用程序13 1.6 本章 小结17 第2章 visualbasic.net编程基础18 2.1 基础编程知识18 2.1.1 关键字及标识符18 2.1.2 数据类型20 .2.1.3 变量与常量24 2.1.4 自定义结构体26 2.1.5 数组27 2.1.6 运算符与表达式29 2.1.7 结构化控制语句32 2.2 面向对象编程40 2.2.1 “面向对象编程”中的概念40 2.2.2 “对象”和“类”的使用42 2.2.3 创建自定义类45 2.3 控件常用属性47 2.4 api函数的应用49 2.4.1 api简介49 2.4.2 api的声明50 2.4.3 api的应用实例51 2.5 本章 小结52 第2篇 数据库应用开发实例 第3章 家庭理财系统54 3.1 实例功能说明54 3.2 系统设计方案55 3.2.1 模块设计及开发环境55 3.2.2 系统结构图55 3.2.3 数据库设计56 3.3 相关技术点拨58 3.3.1 ado.net数据库访问技术58 3.3.2 菜单的建立 3.3.2 (menustrip控件)62 3.3.3 状态栏的建立 3.3.2 (statusbar控件)63 3.3.4 datagrid控件的应用64 3.3.5 savefiledialog组件65 3.4 程序实现与代码66 3.4.1 家庭理财系统主界面窗体66 3.4.2 查询统计窗体设计78 3.5 实例总结83 第4章 超市管理系统84 4.1 实例功能说明84 4.2 系统设计方案88 4.2.1 模块设计及开发环境88 4.2.2 系统结构图89 4.2.3 数据库设计89 4.3 相关技术点拨91 4.3.1 工具栏的建立91 4.3.2 linklabel1控件93 4.4 程序实现与代码93 4.4.1 登录窗体93 4.4.2 超市管理系统主界面窗体96 4.4.3 进货管理窗体98 4.4.4 价格管理窗体103 4.4.5 售货管理窗体107 4.4.6 进货查询窗体113 4.4.7 售货查询窗体115 4.4.8 登录密码修改窗体118 4.4.9 增加用户窗体119 4.4.1 0关于窗体121 4.5 实例总结122 第5章 人事管理系统123 5.1 实例功能说明123 5.2 系统设计方案130 5.2.1 模块设计及开发环境130 5.2.2 系统结构图130 5.2.3 数据库设计131 5.3 相关技术点拨134 5.3.1 闪窗设计134 5.3.2 如何使用toolstrip控件创建工具栏134 5.3.3 打印报表窗体设计135 5.4 程序实现与代码139 5.4.1 闪窗设计139 5.4.2 登录窗体140 5.4.3 人事管理系统主界面窗体140 5.4.4 编辑员工档案窗体146 5.4.5 员工档案查询窗体150 5.4.6 员工档案报表窗体151 5.5 实例总结152 第6章 酒店管理系统153 6.1 实例功能说明153 6.2 系统设计方案157 6.2.1 模块设计及开发环境157 6.2.2 系统结构图158 6.2.3 数据库设计158 6.3 相关技术点拨160 6.3.1 如何在button控件类型上添加图片并调整图片与 6.3.1 文字的对齐方式160 6.3.2 如何使房间的编号与房间类型匹配160 6.3.3 如何实现结账退房161 6.4 程序实现与代码161 6.4.1 酒店管理系统主界面窗体161 6.4.2 客房信息设置窗体162 6.4.3 预订管理窗体165 6.4.4 入住管理窗体168 6.4.5 结账退房窗体172 6.4.6 客房信息查询窗体175 6.4.7 预订信息查询窗体176 6.4.8 入住登记查询窗体177 6.4.9 入住客史查询窗体178 6.5 实例总结178 第7章 销售管理系统179 7.1 实例功能说明179 7.2 系统设计方案191 7.2.1 模块设计及开发环境191 7.2.2 系统结构图191 7.2.3 数据库设计191 7.3 相关技
这本书的内容是帮你全面了解java虚拟机,本书第1版两年内印刷近10次,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干与生产环境相结合的实战案例;对第1版中的错误和不足之处的修正;等等。 第2版不仅技术更新、内容更丰富,而且实战性更强。全书共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果;第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。 前言 第一部分 走近Java 第1章 走近Java 1.1 概述 1.2 Java技术体系 1.3 Java发展史 1.4 Java虚拟机发展史 1.4.1 Sun Classic Exact VM 1.4.2 Sun HotSpot VM 1.4.3 Sun Mobile-Embedded VM Meta-Circular VM 1.4.4 BEA JRockit IBM J9 VM 1.4.5 Azul VM BEA Liquid VM 1.4.6 Apache Harmony Google Android Dalvik VM 1.4.7 Microsoft JVM及其他 1.5 展望Java技术的未来 1.5.1 模块化 1.5.2 混合语言 1.5.3 多核并行 1.5.4 进一步丰富语法 1.5.5 64位虚拟机 1.6 实战:自己编译JDK 1.6.1 获取JDK源码 1.6.2 系统需求 1.6.3 构建编译环境 1.6.4 进行编译 1.6.5 在IDE工具中进行源码调试 1.7 本章小结 第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行时常量池 2.2.7 直接内存 2.3 HotSpot虚拟机对象探秘 2.3.1 对象的创建 2.3.2 对象的内存布局 2.3.3 对象的访问定位 2.4 实战:OutOfMemoryError异常 2.4.1 Java堆溢出 2.4.2 虚拟机栈和本地方法栈溢出 2.4.3 方法区和运行时常量池溢出 2.4.4 本机直接内存溢出 2.5 本章小结 第3章 垃圾收集器与内存分配策略 3.1 概述 3.2 对象已死吗 3.2.1 引用计数算法 3.2.2 可达性分析算法 3.2.3 再谈引用 3.2.4 生存还是死亡 3.2.5 回收方法区 3.3 垃圾收集算法 3.3.1 标记-清除算法 3.3.2 复制算法 3.3.3 标记-整理算法 3.3.4 分代收集算法 3.4 HotSpot的算法实现 3.4.1 枚举根节点 3.4.2 安全点 3.4.3 安全区域 3.5 垃圾收集器 3.5.1 Serial收集器 3.5.2 ParNew收集器 3.5.3 Parallel Scavenge收集器 3.5.4 Serial Old收集器 3.5.5 Parallel Old收集器 3.5.6 CMS收集器 3.5.7 G1收集器 3.5.8 理解GC日志 3.5.9 垃圾收集器参数总结 3.6 内存分配与回收策略 3.6.1 对象优先在Eden分配 3.6.2 大对象直接进入老年代 3.6.3 长期存活的对象将进入老年代 3.6.4 动态对象年龄判定 3.6.5 空间分配担保 3.7 本章小结 第4章 虚拟机性能监控与故障处理工具 4.1 概述 4.2 JDK的命令行工具 4.2.1 jps:虚拟机进程状况工具 4.2.2 jstat:虚拟机统计信息监视工具 4.2.3 jinfo:Java配置信息工具 4.2.4 jmap:Java内存映像工具 4.2.5 jhat:虚拟机堆转储快照分析工具 4.2.6 jstack:Java堆栈跟踪工具 4.2.7 HSDIS:JIT生成代码反汇编 4.3 JDK的可视化工具 4.3.1 JConsole:Java监视与管理控制台 4.3.2 VisualVM:多合一故障处理工具 4.4 本章小结 第5章 调优案例分析与实战 5.1 概述 5.2 案例分析 5.2.1 高性能硬件上的程序部署策略 5.2.2 集群间同步导致的内存溢出 5.2.3 堆外内存导致的溢出错误 5.2.4 外部命令导致系统缓慢 5.2.5 服务器JVM进程崩溃 5.2.6 不恰当数据结构导致内存占用过大 5.2.7 由Windows虚拟内存导致的长时间停顿 5.3 实战:Eclipse运行速度调优 5.3.1 调优前的程序运行状态 5.3.2 升级JDK 1.6的性能变化及兼容问题 5.3.3 编译时间和类加载时间的优化 5.3.4 调整内存设置控制垃圾收集频率 5.3.5 选择收集器降低延迟 5.4 本章小结 第三部分 虚拟机执行子系统 第6章 类文件结构 6.1 概述 6.2 无关性的基石 6.3 Class类文件的结构 6.3.1 魔数与Class文件的版本 6.3.2 常量池 6.3.3 访问标志 6.3.4 类索引、父类索引与接口索引集合 6.3.5 字段表集合 6.3.6 方法表集合 6.3.7 属性表集合 6.4 字节码指令简介 6.4.1 字节码与数据类型 6.4.2 加载和存储指令 6.4.3 运算指令 6.4.4 类型转换指令 6.4.5 对象创建与访问指令 6.4.6 操作数栈管理指令 6.4.7 控制转移指令 6.4.8 方法调用和返回指令 6.4.9 异常处理指令 6.4.10 同步指令 6.5 公有设计和私有实现 6.6 Class文件结构的发展 6.7 本章小结 第7章 虚拟机类加载机制 7.1 概述 7.2 类加载的时机 7.3 类加载的过程 7.3.1 加载 7.3.2 验证 7.3.3 准备 7.3.4 解析 7.3.5 初始化 7.4 类加载器 7.4.1 类与类加载器 7.4.2 双亲委派模型 7.4.3 破坏双亲委派模型 7.5 本章小结 第8章 虚拟机字节码执行引擎 8.1 概述 8.2 运行时栈帧结构 8.2.1 局部变量表 8.2.2 操作数栈 8.2.3 动态连接 8.2.4 方法返回地址 8.2.5 附加信息 8.3 方法调用 8.3.1 解析 8.3.2 分派 8.3.3 动态类型语言支持 8.4 基于栈的字节码解释执行引擎 8.4.1 解释执行 8.4.2 基于栈的指令集与基于寄存器的指令集 8.4.3 基于栈的解释器执行过程 8.5 本章小结 第9章 类加载及执行子系统的案例与实战 9.1 概述 9.2 案例分析 9.2.1 Tomcat:正统的类加载器架构 9.2.2 OSGi:灵活的类加载器架构 9.2.3 字节码生成技术与动态代理的实现 9.2.4 Retrotranslator:跨越JDK版本 9.3 实战:自己动手实现远程执行功能 9.3.1 目标 9.3.2 思路 9.3.3 实现 9.3.4 验证 9.4 本章小结 第四部分 程序编译与代码优化 第10章 早期(编译期)优化 10.1 概述 10.2 Javac编译器 10.2.1 Javac的源码与调试 10.2.2 解析与填充符号表 10.2.3 注解处理器 10.2.4 语义分析与字节码生成 10.3 Java语法糖的味道 10.3.1 泛型与类型擦除 10.3.2 自动装箱、拆箱与遍历循环 10.3.3 条件编译 10.4 实战:插入式注解处理器 10.4.1 实战目标 10.4.2 代码实现 10.4.3 运行与测试 10.4.4 其他应用案例 10.5 本章小结 第11章 晚期(运行期)优化 11.1 概述 11.2 HotSpot虚拟机内的即时编译器 11.2.1 解释器与编译器 11.2.2 编译对象与触发条件 11.2.3 编译过程 11.2.4 查看及分析即时编译结果 11.3 编译优化技术 11.3.1 优化技术概览 11.3.2 公共子表达式消除 11.3.3 数组边界检查消除 11.3.4 方法内联 11.3.5 逃逸分析 11.4 Java与CC++的编译器对比 11.5 本章小结 第五部分 高效并发 第12章 Java内存模型与线程 12.1 概述 12.2 硬件的效率与一致性 12.3 Java内存模型 12.3.1 主内存与工作内存 12.3.2 内存间交互操作 12.3.3 对于volatile型变量的特殊规则 12.3.4 对于long和double型变量的特殊规则 12.3.5 原子性、可见性与有序性 12.3.6 先行发生原则 12.4 Java与线程 12.4.1 线程的实现 12.4.2 Java线程调度 12.4.3 状态转换 12.5 本章小结 第13章 线程安全与锁优化 13.1 概述 13.2 线程安全 13.2.1 Java语言中的线程安全 13.2.2 线程安全的实现方法 13.3 锁优化 13.3.1 自旋锁与自适应自旋 13.3.2 锁消除 13.3.3 锁粗化 13.3.4 轻量级锁 13.3.5 偏向锁 13.4 本章小结 附  录 附录A 编译Windows版的OpenJDK 附录B 虚拟机字节码指令表 附录C HotSpot虚拟机主要参数表 附录D 对象查询语言(OQL)简介 附录E JDK历史版本轨迹

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值