一、概念术语
进程:进程通常是程序、应用的同义词。不过,用户所看到的一个单独的应用事实上可能还会有一系列的协作进程(cooperating processes
),例如Linux上就可以通过fork创建一个进程副本。最简单的情况下,一个应用就是一个进程。大部分Java虚拟机的实现都是作为单进程运行的,但是我们也可以通过ProcessBuilder来创建附加的进程。
线程:线程有时又称之为轻量级进程
。但是创建一个线程要消耗的资源通常比创建进程少的多。一个进程内的多个线程会共享进程的资源,同时也会有自己私有的资源。线程必须存在于进程中,每个进程至少要有一个线程作为程序的入口,称之为主线程。
并发:在单核CPU的计算机上,即使操作系统支持多任务同时运行,但事实上在任一时刻,只有一个进程中的一个线程在运行,因为一个CPU同一时刻只能处理一个指令。看起来在同时执行的多个任务其实是抢占式的重叠交替执行,这就是并发。
并行:在多核CPU的计算机上,每个CPU核心可以在同一时刻同时执行不同的指令,从而能够实现并行的多线程执行模型。
二、Java与线程
一个进程内可以创建的线程个数不但受到不同操作系统使用的线程模型
限制,还要受到系统资源比如内存大小的限制,因为每个线程都有自己的栈内存空间。当然对于Java进程创建的线程,栈内存空间主要是受到JVM可以使用的内存大小的影响,而不是操作系统的总内存。
Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是由JVM的实现来确定的。Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核线程有一一对应的关系。这样做的好处是什么?线程的调度完全交给了操作系统内核,当然jvm还保留一些策略足以影响到其内部的线程调度。
三、多线程的优点与代价
多线程可以为程序设计带来如下优势:
* 资源利用率更高
例如,通过磁盘或者网络IO进行文件/内容检索之后进行特定的处理中,由于磁盘/网络IO操作需要等待相对长的时间,而CPU在这段时间是处于空闲状态,其深层次的原因是对于IO操作(这里主要指磁盘IO),往往是通过硬件直接存取器(DMA)来执行的,也就是说,CPU只需要发送一个指令给DMA去执行对应的IO操作即可,指令发送是一瞬间的事,发送完成CPU就可以干其他的事了。如果采用多线程的方式,那么就可以使CPU在等待的过程中去处理其他可以被处理的逻辑,从而对CPU的利用率大大提高。
* 程序响应更快
在桌面应用类似的C/S程序设计中,往往用户提交的耗时任务不需要立即返回,但是用户界面不能够一直处于等待的不可用状态,用户可以在这段时间进行其它操作,当耗时任务完成之后主动通知给用户,这种多线程的设计方式为用户提供了更快更优雅的体验。
多线程不仅为程序设计带来了好处,同时又相应的需要付出一些代价:
* 程序设计更复杂
多线程的并发程序设计中如果涉及到共享数据的访问,如何防止并发访问导致共享数据的混乱将是非常困难以及使程序设计更复杂的因素。
* 多线程的上下文切换开销
当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针 等,最后才开始执行。这种切换称为“上下文切换”(“context switch
”)。CPU会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程。上下文切换并不廉价。如果没有必要,应该减少上下文切换的发生。
* 线程栈空间增加了内存资源消耗
每一个线程启动后,进程也要给线程分配一定的内存,让其来保存自己的私有数据。JVM划分给每个线程的内存区域称之为线程栈内存
。默认情况下,栈内存的大小1M。也就是说,你每多启动一个线程,至少要多消耗1M的内存资源。
相关推荐
本文将为您提供一份C++基础知识的概述,帮助初学者了解这门语言的核心概念。这篇文章提供了C++基础知识的概览,帮助读者了解这门语言的核心概念。如果您想更深入地学习C++,可以探索面向对象编程、模板编程、多线程...
Java学习更是如此,知识点总结目录如下: 目录 一、 Java概述 3 二、 Java语法基础 5 数据类型 5 运算符号 14 语句 15 函数 15 方法重载(Overloadjing)与重写(Overriding) 16 数组 17 总结 18 三、 常见关键字 ...
Java基础知识 第01章_Java语言概述(共50页).pptx Java基础知识 第02章_Java基本语法1(共99页).pptx Java基础知识 第02章_Java基本语法2(共48页).pptx Java基础知识 第03章_面向对象编程(共100页).pptx Java基础知识 ...
Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 特别适合新入门自学的新手同学,也适合老手回顾学习,巩固知识 第1章 Java语言概述 第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5...
《Java核心技术·卷1:基础知识(原书第9版)》共14章。第1章概述了Java语言与其他程序设计语言不同的性能;第2章讲解了如何下载和安装JDK及本书的程序示例;第3章介绍了变量、循环和简单的函数;第4章讲解了类和...
Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 特别适合新入门自学的新手同学,也适合老手回顾学习,巩固知识 第1章 Java语言概述 第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5...
Java基础[01-Java概述].pdf Java基础[02-Java基础语法1].pdf Java基础[02-Java基础语法2].pdf Java基础[03-面向对象].pdf Java基础[04-继承上].pdf Java基础[04-继承下].pdf Java基础[05-多线程].pdf Java基础[06-...
第一章:计算机基础知识 1.1 计算机概述 计算机的发展历史 计算机的分类与应用领域 计算机系统的基本组成 1.2 计算机硬件系统 中央处理器(CPU) 主板与扩展卡 存储器 输入输出设备 1.3 计算机软件...
JAVA基础知识课件 适合初学者 包括 ch1 Java概述 ch2 Java基本语法 ch3 类与对象 ch4-1 继承、接口和多态 ch4-2 继承、接口和多态 ch5 常用Java类库 ch6 异常处理 ch7 IO流与文件读写 ch8-1 基于Swing的图形用户界面...
《JAVA核心技术 中文第八版》共分(卷1基础知识)和(卷2高级特性)两部分,由于文件比较大,共拆分为7个分卷: (卷1拆分为4个分卷,卷2拆分为3个分卷) 卷1基础知识 序言 《JAVA核心技术》自第一版出版以来,一直...
《Java核心技术+卷1:基础知识(原书第9版)》 《Java核心技术·卷1:基础知识》共14章。第1章概述了Java语言与其他程序设计语言不同的性能;第2章讲解了如何下载和安装JDK及本书的程序示例;第3章介绍了变量、循环...
1、基础概念多线程与并发(一)——概述、线程状态进程与线程区别?多线程与并发(二)——线程同步、线程协作同步方法和同步代码块?多线程与并发(三)——JUC概述、
《JAVA核心技术 中文第八版》共分(卷1基础知识)和(卷2高级特性)两部分,由于文件比较大,共拆分为4个分卷: (由于上传权限原因,卷1拆分为2个分卷,卷2拆分为2个分卷) 卷1基础知识 序言 《JAVA核心技术》自...
《JAVA核心技术 中文第八版》共分(卷1基础知识)和(卷2高级特性)两部分,由于文件比较大,共拆分为4个分卷: (由于上传权限原因,卷1拆分为2个分卷,卷2拆分为2个分卷) 卷1基础知识 序言 《JAVA核心技术》自...
Java核心技术 卷Ⅰ:基础知识 【中文】 第1章概述Java与其他程序设计语言不同的性能。解释这种语言的设计初衷,以及在哪些方 面达到了预期的效果。然后,简要叙述Java诞生和发展的历史。 第2章详细地论述如何下载和...
Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 特别适合新入门自学的新手同学,也适合老手回顾学习,巩固知识 第1章 Java语言概述 第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5...
Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 特别适合新入门自学的新手同学,也适合老手回顾学习,巩固知识 第1章 Java语言概述 第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5...
Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 特别适合新入门自学的新手同学,也适合老手回顾学习,巩固知识 第1章 Java语言概述 第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5...
Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 特别适合新入门自学的新手同学,也适合老手回顾学习,巩固知识 第1章 Java语言概述 第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5...
Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 特别适合新入门自学的新手同学,也适合老手回顾学习,巩固知识 第1章 Java语言概述 第2章 基本语法 第3章 面向对象编程 第4章 高级类特性1 第5...