黑马程序员——多线程1:概述

------- android培训java培训、期待与您交流! ----------

1. 进程

        在讲述线程之前,我们首先需要知道什么是进程。所谓进程,就是正在进行中的程序。当我们打开任务管理器,选中“进程”选项卡时显示在窗口中间的就是当前正在后台运行的所有进程,如下图:

 

        这一列表给了我们一个这些程序都在同时运行的错觉。之所以说它是错觉是因为,程序的执行依赖于CPU的运行,而CPU(单核)在某一时刻只能处理一个程序,而之所以上图中的程序可以“同时”运行是因为,CPU在这些程序之间进行快速的切换,先运行一会儿“程序1”,然后是“程序2”,接着“程序3”,以此类推,进行不断的循环。而CPU的切换速度非常快,快到人类无法察觉到。

但是,CPU也有它自身的工作极限,或者称之为“在人无法察觉的情况下可以正常运行的程序数量”,一旦开启的程序数量超过这一极限,就会感到明显的卡顿,最严重的情况下就是死机。

 2. 线程

        那么我们现在知道了CPU可以“同时”运行多个程序,而实际上每个程序又是由多个“执行通道”组成。举个例子,比如我们使用迅雷下载一个100M大小的文件,如果只有一个“执行通道”,该通道的下载速度为1M/s,那么总的下载速度就是1M/s;而假如共有五个“执行通道”,每个通道负责下载20M大小的部分文件,并且每个通道的下载速度都是1M/s,那么总的下载速度就是5M/s,大大提高了下载效率。

        而上述所谓的“执行通道”就是线程。每个程序在运行时都会为其分配一片内存空间,该内存空间当中存储的就是负责执行该程序的进程,所以这些线程都包含在一个进程中,换句话说,线程是进程中的内容。每个进程都至少有一个线程,所以线程被称作程序的“控制单元”,而程序的执行从代码的角度来说是按照代码的书写顺序执行的,所以线程又被称作“执行路径”。

那么根据上述迅雷的例子来说,使用多线程技术实现功能是不是一定就能提高程序的执行效率呢?答案是不一定的,甚至可能会降低程序的执行效率,因此CPU需要在多个线程之间进行不断的切换,增加了处理器的负担,而上述例子中之所以提高了下载速度,这其实与程序的执行效率无关,只不过由于客户端申请了多个线程进行下载,服务器会为每个线程提供固定的网络带宽,因此多个线程就代表了更大的下载速度。

3. Java中的线程

        现在我们结合Java来进一步解释线程。无论是通过javac.exe程序对源代码进行编译,还是通过java.exe程序执行字节码文件,当他们在运行的时候就是一个进程。以java.exe为例,如果我们在控制台中输入java命令执行某个字节码文件,在启动虚拟机的同时,就可以在任务管理器中观察到java.exe进程(对于小程序,通常是转瞬即逝的),在这过程中至少有一个线程来负责执行java进程,并且这个线程运行的代码存在于main方法中,而负责执行main方法的线程,称之为主线程。

        到目前为止我们玩儿过得那些小程序都是单线程的,因为,他们的执行均依赖于主线程。那么多线程的意思就是,一个程序的执行,除了主线程以外,至少还有一个线程负责执行某一段代码,而这段代码不由主线程负责。


小知识点1:

        实际上,由java语言编写的程序中,即使在某段代码中没有显示地使用多线程,那些看起来是单线程的程序也是多线程的。这是因为,java程序在执行过程中,通常都会在堆内存中产生大量对象,当对象被调用过以后,就会通过垃圾回收机制被“处理”掉,而垃圾回收过程的执行,是与主线程同时执行的,因此负责执行垃圾回收的是除主线程以外的另一个线程。所以称之为多线程。


4.     多线程的意义

通过上面的描述,我们可以总结出:

(a)    多线程技术的出现,使得单个程序的执行,可以同时完成多个任务,而多个不同任务的组合可以使得程序的功能更为多样化。

(b)    多线程技术,还可以优化程序的执行。设想一下,如果主线程不仅负责正常代码的执行,而且还要去实现垃圾回收机制,那么主线程为了进行垃圾回收,就要暂停正常代码的执行,这是不能接受的。

(c)    当然多线程技术,也可以大幅提高程序的执行效率,比如迅雷的例子。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值