之前写的所有程序,无论大小都没有涉及多线程知识。初次接触多线程是在操作系统课上,当时建立起多线程的概念。后来在Java、C#课上也接触过多线程编程的基础知识,但没有自己动手写个多线程的程序;而且自己学习之余也看过一些关于并行算法、并发编程的理论知识。最近由于课程作业需要,决定开启多线程之旅,全面接触一下多线程。
首先我谈谈我对相关概念的理解。
程序:
比较经典简洁的描述是程序=算法+数据结构,这个概念只是在强调算法与数据结构的重要性;我的理解是程序是用某种计算机能识别的语言编写的计算机能执行的操作序列。
进程:
程序关于某个数据集在处理机上的一次执行过程。
程序与进程的区别:
(1)、程序是个静态的概念,可以一直存在于某中级别的存储器上;进程是个动态的概念,有生命期,创建、等待、就绪、运行、撤销等状态;
(2)、一个程序不同执行过程对应不同进程,程序program运行在A数据集上产生进程processA,程序program运行在B数据集上ze则产生进程processB。
线程:
进程的某个执行路径。一个进程可能有多个执行路径,每个线程仅是其中的一条。
进程与线程的区别:
(1 )、进程是系统进行资源分配与任务调度的基本单位,而线程只是任务调度的基本单位并不是资源分配的基本单位。
(2)、进程至少有一个线程,它们共享进程的地址空间与资源,而进程有自己独立的地址空间与资源。
多道程序设计:
某一时间内在计算机内存中同时存在多道相对独立的程序,它们相互穿插的执行。
多线程编程:
在一个程序中同时运行多个不同的的线程来执行不同的任务。
并发与并行:
并发在一段时间内可以看做是并行的,在某个时间点上只能执行一个;并行在某个时间点上可以执行多个。
适合多线程的场合:
(1)、 程序包含复杂的计算任务时
主要是利用多线程获取更多的CPU时间(资源)。
(2) 、处理速度较慢的外围设备
比如:打印时。再比如网络程序,涉及数据包的收发,时间因素不定。使用独立的线程处理这些任务,可使程序无需专门 等待结果。
(3)、 程序设计自身的需要
WINDOWS系统是基于消息循环的抢占式多任务系统,为使消息循环系统不至于阻塞,程序需要多个线程的来共同完成某些任务。
Java示例代码:
package JavaLanProtocol; class OneThreadClass extends Thread{ public OneThreadClass(String name) { super(name); } public void run() { for(int i=0;i<3;i++) { System.out.println(this.getName()+"在运行!"); try { System.out.println(this.getName()+"开始休眠!"); sleep(1000); System.out.println(this.getName()+"结束休眠!"); } catch(InterruptedException e) { System.out.println(this.getName()+"休眠被打断!"); } } System.out.println(this.getName()+"结束!"); } } public class ThreadClass { public static void main(String []arg) { OneThreadClass one=new OneThreadClass("线程1"); OneThreadClass other=new OneThreadClass("线程2"); one.start(); other.start(); } }运行结果: 线程1在运行! 线程1开始休眠! 线程2在运行! 线程2开始休眠! 线程1结束休眠! 线程1在运行! 线程1开始休眠! 线程2结束休眠! 线程2在运行! 线程2开始休眠! 线程1结束休眠! 线程1在运行! 线程1开始休眠! 线程2结束休眠! 线程2在运行! 线程2开始休眠! 线程1结束休眠! 线程1结束! 线程2结束休眠! 线程2结束!
上面是段毫无意义的多线程Java程序,只是说明多线程在多处理机上是相互交叉执行的。