Java多线程设计(一)由浅入深介绍进程与线程

本文从操作系统角度出发,深入浅出地介绍了进程和线程的概念,对比了单任务与多任务操作系统的特点,并探讨了并发与并行的区别。

1. 概述

在了解线程(thread)我们应该先了解一下进程(process),这两个都是操作系统的概念,比较抽象难懂,所以下面我就用自己的理解解释一下这两个概念,不过还是建议大家去看看操作系统相关的书里面的介绍。

2. 单任务操作系统

在远古的时候(就是上个世纪),个人电脑还没流行,计算机还是一种稀有资源。那时候的操作系统(比如微软的Dos系统),在一个时刻只能处理一个任务,这就是单任务操作系统,然后大家觉得这样子便宜CPU了,因为有时候在进行I/O操作就是输入输出的时候,CPU就没在干活了。

3. 多任务操作系统

然后多任务操作系统就登场了,难道说操作系统在一个时刻可以同时处理多个任务了?不一定,如果是单核CPU的话,一个时刻还是在处理一个任务,只不过CPU在多个任务之间在作快速切换,切换速度之快,让你根本感受不到它在进行切换,就像是我们的肉眼看不出灯泡在闪烁(因为交流电一直在快速地改变大小和方向)。所以,当你边听歌边聊QQ的时候,别以为它们是在同时运行,只不过停顿的时间之短让你感受不到。不过当你程序开太多,就会觉得停顿很明显了。单核CPU在干活的只有一个人在快速切换做任务,它一个人的能力毕竟是十分有限的,所以这就是为什么大家比较追求多核CPU,人多力量大嘛,就可以有多个人一起在快速切换做任务了,停顿的时间自然又短了。其实这里可以衍生出并行(Parallelism)并发(Concurrency)的概念,也是很重要的概念,在这里就先提前给大家讲一下,大家也可以先看完下面进程和线程的概念再回过头来看这里。

4. 并发和并行

当有多个线程在操作时,如果计算机只有一个单核CPU,那就不可能真正做到同时进行一个线程以上的处理,例如下图,红色框框代表在处理,你会发现两个线程之间的红色框框是没有重合的地方的,这就是并发的情况。

而如果是多核CPU的话,就可以真正做到同时进行一个线程以上的处理,情况就有可能变成下面这样子,这就是并行的情况。

所以当一台拥有多核CPU或者多个CPU的计算机在处理具有多个线程操作的Java程序时,则线程操作可能是并行的而非并发。

5. 进程和线程

好了,现在终于要说到我们的进程线程了,其实大家可以把上面的多任务操作系统中的任务看作是进程。在支持线程的操作系统中,把进程作为资源拥有的基本单位,把线程作为调度和分派的基本单位。什么意思呢,就是说进程是面子,线程是里子(仿造王家卫电影《一代宗师》),就像是政府项目招标,他的项目只给公司而不是给个人,但是公司中标后真正干活的还是公司里面的员工,但是钱是给公司的,不过公司得负责给员工发工资。说到这里,相信你已经有点模糊的概念了。我们可以对应一下,政府项目-程序,公司-进程,员工-线程,钱-资源。下面来总结一下:

  • 一个程序至少需要一个进程,就像是一个政府项目起码要外包给至少一个公司做,有时候可能多个呢。
  • 一个进程至少需要一个线程,就像是一个公司起码要有一个员工
  • 进程是资源分配的基本单位,线程作为调度和分派的基本单位,同一个进程中的线程共享资源,就像是政府项目发的钱是给公司的,但是公司干活的是员工,但是公司要拿这些钱去给员工发工资。

以上为个人理解,如果有什么说的不好或者不正确的,还请朋友们指点一下。

本书浅显易懂的介绍JAVA线程相关的设计模式,通过程序范例和UML图示来解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是本学习和认识JAVA设计模式的本好书。(注意,本资源附带书中源代码可供参考) 多线程并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来解说,书中在代码的重要部分加上标注使读者更加容易解读,再配合众多的说明图解,无论对于初学者还是程序设计高手来说,这都是本学习和认识设计模式非常难得的好书。 书中包含Java线程介绍导读、12个重要的线程设计模式和全书总结以及丰富的附录内容。第章相关线程设计模式的介绍,都举反三使读者学习更有效。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的精华,书中最后附上练习问题解答,方便读者学习验证。 目录 漫谈UML UML 类图 类和层次结构的关系 接口实现 聚合 访问控制 类间的关联性 顺序图 处理流程和对象间的协调 时序图 Introduction 1 Java语言的线程 Java语言的线程 何谓线程 明为追踪处理流程,实则追踪线程线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 线程的协调 wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他话题 重点回顾 练习问题 Introduction 2 多线程程序的评量标准 多线程程序的评量标准 安全性——不损坏对象 生存性——进行必要的处理 复用性——可再利用类 性能——能快速、大量进行处理 评量标准的总结 重点回顾 练习问题 第1章 Single Threaded Execution——能通过这座桥的,只有个人 第2章 Immutable——想破坏它也没办法 第3章 Guarded Suspension——要等到我准备好喔 第4章 Balking——不需要的话,就算了吧 第5章 Producer-Consumer——我来做,你来用 第6章 Read-Write Lock——大家想看就看吧,不过看的时候不能写喔 第7章 read-Per-Message——这个工作交给你了 第8章 Worker Thread——等到工作来,来了就工作 第9章 Future——先给您这张提货单 第10章 Two-Phase Termination——快把玩具收拾好,去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值