Java多线程:线程与进程

实际上,线程和进程的区别,在学OS时必然是学习过的,所缺的不过是一些总结。

1. 进程

进程(process)是计算机中已运行程序的实体。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行。现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)运行的感觉。同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机架构,同样程序的平行线程,可在多CPU主机或网络上真正同时运行(在不同的CPU上)。

2. 线程

线程(thread)是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

3. 进程与线程

我们可以总结出以下几条区别:

  • 尺度:进程是线程的容器,线程是程序执行的最小单元。 一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程。
  • 执行:进程往往有独立的运行入口,顺序执行序列,独立的运行出口。线程不能独立执行,必须依存于应用程序,由应用程序来进行线程控制。
  • 资源:进程和线程最主要的区别是他们是不同的操作系统资源管理方式。
    • 进程有独立的地址空间,一个进程在崩溃后,在保护模式下不会对其他进程产生影响。而线程只是一个进程中的不同执行路径,线程有自己独立的栈和局部变量,但线程之间没有独立的地址空间(参见Java基础:Java虚拟机(JVM)),一个线程死掉往往导致整个进程死掉,所以多进程程序要比多线程程序健壮,但在进程切换时,资源消耗较大,效率要差一些。
    • 对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

4. 多进程与多线程对比

  • 数据共享性:多进程共享依赖复杂的进程间通信;多线程数据共享因共享进程数据而十分简单。
  • 数据同步:多进程数据分开,同步简单;多线程数据同步复杂。
  • 资源消耗:多进程占用CPU,内存多;多线程占用CPU,内存小。
  • 创建销毁切换:多进程复杂;多线程简单。
  • 编程:多进程简单;多线程复杂。
  • 可靠性:多进程不进行进程间通信的话,进程间不会互相影响;多线程一个线程挂掉将导致整个进程挂掉。
  • 分布式:多进程适合多机分布式,扩展方便;多线程适合多核分布式。

5. Java多进程与多线程

5.1. Java多进程

我们常常去讲多线程开发,但是很少去讲多进程。
对于Java而言,所有的Java程序都是在JVM中运行,而在JVM内部,程序的运行是通过多线程实现的。每当用户启动一个Java应用程序,就启用了一个Java进程。
Java的多进程通信可以使用管道或者socket。

5.2. Java多线程

正如在文章JVM里讲过那样,Java的多线程是和操作系统的线程进行映射的。实际上Thread类的大部分api和Java其他api不同,其关键方法是native方法,换言之,Java的多线程的实现有赖于操作系统本身的多线程实现,操作系统的线程模型很大程度的决定了Java虚拟机的映射。
综上,Java本身运行在JVM虚拟机中,而Java的多进程通信又只能依赖于管道和socket,在绝大多情况下,应该考虑的是多线程而非多进程。

6. 参考文章

进程和线程的区别
JAVA多进程与多线程的概念
多线程还是多进程的选择及区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,274评论 11 349
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,458评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,964评论 1 18
  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 7,357评论 3 87
  • R阅读原文:《非暴力沟通》p16-23 I用自己的语言描述:是什么蒙蔽了爱?有4个因素: 1,道德评判,人们习惯将...
    ailsa宁波阅读 191评论 0 1