面向对象多线程编程之 前言

来源:百度文库 编辑:神马文学网 时间:2024/04/20 10:58:25
一  为什么使用多线程 多线程能够帮助设计更具有响应性的图形界面,尤其是多媒体应用程序的图形界面。想象一下,如果我们想要从Internet上下载一段很长的视频或者音频片段,如果我们可以把下载任务放在一个独立的线程里实现,我们在下载开始之后很快就可以观看这个片段了,而不是必须等全部下载完成才可以观看。此外,多线程的执行还可以允许许多用户同时访问一个公共的数据库,这个特性对于类似库存管理和机票预定这样的系统有时候显得非常有用。为了防止由于多个用户同时读取和写入公共数据库而造成的数据破坏,多线程还需要在对象上设置锁。这样一个时刻只有一个线程能够修改一个对象的状态。 二 线程和进程之间的区别 对于上面的使用多线程的理由,是否可以也使用进程来实现同样的效果呢?并发的进程和并发的线程之间的区别是非常关键的。线程是在进程内执行的。在典型的情况下,一个进程需要他自己的地址空间,二同时执行的多线程则共享相同的地址空间,也就是他们所在的进程的地址空间。这就使得多个线程更容易访问内存中的相同数据。同时,线程切换所需要的时间也比进程切换的时间要短。另外线程间的通信比进程间的通信要快的多(线程的创建速度比进程的创建速度快10到100倍) 三 多线程程序的运行 在一个多线程程序里,不同的线程可以有不同的优先级。但是这些优先级实际上如何发挥作用,在不同的系统中可能会有很大的差异。在普通情况下,具有最高优先级的线程被选择执行。一个具有当前最高优先级的线程将持续执行,知道出现一个具有更高优先级的线程。但是,在使用抢占式多任务系统中,线程被划分为许多时间片,这样每个线程都有可能被CPU选中。当线程划分为时间片时,具有相同优先级的线程轮流执行。处理相同优先级的线程的另一种方法是让一个线程运行直到结束为止,除非这个线程被另外一个寻求执行的具有更高优先级的线程抢占(称为优先级强抢占式多任务),或者由于一条sleep或者wait命令而暂时停止执行。 具有多线程能力的编程语言的效率最终依赖于线程如何映射到底层操作系统的本地线程中。这种映射关系在绝大多数情况下对于编写应用程序的程序员是隐藏的。对于一种编程语言而言,这种映射关系因编译器而异。以java为例,java虚拟机的有些实现采用了绿线程,他们都是操作系统的一个单一的本地线程中执行的。java虚拟机的其他一些实现可以直接使用本地线程,这就允许java的线程在多处理器计算机上并行执行。但是java虚拟机的另外一些实现有可能动态的把n个java线程映射到m个本地线程中。在Linux中,每个java线程可能会映射到操作系统的一个独立的进程中。