版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第11章多线程编程与大多数其他计算机语言不同,Java本机支持多线程编程。多线程程序由两个或多个并发执行部分组成。程序的每个此类部分称为线程(thread),每个线程都有单独的执行路径。因此,多线程是多任务处理的一种特殊形式。您可能知道多任务处理。因为实际上,所有最新的操作系统都支持它。但是,多任务处理有两种类型:基于流程和基于线程。知道两者的区别很重要。对很多读者来说,基于流程的多任务处理是更为熟悉的形式。进程实质上是运行的程序。因此,基于流程的多任务处理的特点是可以在计算机上同时运行两个或多个程序。例如,使用文本编辑器进行基于进程的多任务处理时,可以同时运行Java编译器。在基于流程的多任
2、务处理中,程序是调度程序分配的最小代码单元。在基于线程的多任务环境中,线程是最小的执行单元。也就是说,一个程序同时执行两个或多个任务的能力。例如,文本编辑器可以在打印过程中设置文本格式。因此,多进程程序处理“大图”,多线程程序处理细节。多线程程序比多进程程序的管理成本低。过程是需要分配自己的单独地址空间的重量级操作。过程之间的通信既昂贵又有限。过程之间的转换也很昂贵。相反,线程是轻量级选手。共享相同的地址空间,共享相同的进程。线程间通信成本低,线程间切换成本低。如果Java程序使用多进程作业处理环境,则多进程程序不受Java控制,多线程受Java控制。多线程有助于编写记录CPU最大利用率的高效
3、程序,因为它将空闲时间保持在最低限度。这对于Java运行的交互式网络互连环境非常重要,因为空闲时间是公共的。例如,网络上的数据传输速率远低于计算机处理能力,本地文件系统资源的读写速度远低于CPU处理能力。当然,用户输入也比计算机慢得多。在传统单线程环境中,即使CPU的空闲时间很长,程序也必须等待这些任务中的每个任务完成,然后才能执行下一步。多线程可以获得和充分利用这些空闲时间。如果您在Windows 98或Windows 2000等操作系统上有编程经验,则可能已经熟悉多线程。但是,Java管理线程对用户来说特别方便,因为很多细节都很容易处理。11.1 Java线程模型Java执行系统在很多方面
4、依赖于线程,所有类库设计都考虑了多线程。实际上,Java使用线程使整个环境异步。这样可以避免浪费CPU环路,从而减少无效部分。为了更好地了解多线程环境的优点,可以将其与比较对象进行比较。单线程系统使用称为轮询的事件循环方法进行处理。在此模型中,单线程控制在无限循环中运行,轮询事件序列以确定下一步要执行的操作。当轮询设备返回信号,表明它已准备好读取网络文件时,事件循环调度控制将由相应的事件处理程序管理。在返回事件处理程序之前,系统不会引发其他事件。这会浪费CPU时间。这导致程序的一部分独占了系统,阻止了其他事件的执行。在单线程环境中,如果一个线程在等待资源时被阻塞(block,停止运行),整个程
5、序执行将停止。Java多线程的优点是取消了主周期/轮询机制。线程可以暂停,而不会影响程序的其他部分。例如,一个线程可以从网络读取数据,或利用在等待用户输入时发生的空闲时间。多线程可能会在每个帧间隔处锁定活动循环一秒钟,而不会暂停整个系统。Java程序遇到线程阻塞,只暂停一个线程,其他线程继续运行。线程存在于多个状态中。执行绪可以执行(执行(running)。获得CPU时间后即可运行。正在运行的线程被挂起,可以暂时中止执行。暂停的线程可以恢复,以便从停止的地方继续运行。线程在等待资源时可能被阻塞(block)。您可以随时终止线程,这会立即停止执行。一旦终止,线程就无法恢复。11.1.1线程优先级
6、Java会排定每个执行绪的优先顺序,以决定与其他执行绪相比,如何处理这些执行绪。线程优先级是详细说明线程间优先级的整数。作为绝对值,优先顺序没有意义。只有一个线程时,优先级高的线程不会比优先级低的线程运行得快。相反,线程的优先级用于确定从一个正在运行的线程切换到另一个线程的时间。这称为前后关联转移(context switch)。决定前后关联转移出现位置的规则很简单。螺纹可以自动放弃控制。在I/o未确定的情况下,睡眠或阻塞由明确的让步执行。在此假设中,所有其他线程都将被发现并准备运行的最高优先级线程将被授予CPU。螺纹可以由优先级高的螺纹抢占。在这种情况下,低优先级线程不会主动放弃,即使高优先
7、级线程占用处理器,处理器也首先占用。默认情况下,高优先级线程在运行时运行。这称为具有优先级的多任务处理。两个具有相同优先级的线程竞争CPU周期时,情况有些复杂。对于Windows98等操作系统,等待优先级的线程在循环模式下自动划分时间。对于其他操作系统(如Solaris 2.x),优先级线程基于其对等项自动终止。否则,其他线程将不会运行。警告:在其他操作系统下,相同优先级线程的上下文转换可能会导致错误。11.1.2同步多线程在程序中引入异步行为,因此需要时必须有加强同步的方法。例如,如果两个线程相互通信并共享复杂的数据结构(如连接的列表序列),则需要一些方法以避免相互冲突。也就是说,一个线程必
8、须写入数据,另一个线程必须防止读取连接列表中的数据。为此,Java基于进程间同步的现有模式实现了另一种方法“监视器”(monitor)。管道是C.A.R.Hoare首先定义的控制机制。您可以将管路行程想成只控制一个螺纹的小方块。螺纹进入管路时,必须等待所有螺纹,直到螺纹终止管路为止。此方法可防止共享资源被多个线程操作。许多多线程系统使用管道路径作为明确参照和操作程序的目标。Java提供了明确的解决方案。没有“监视器”类。相反,每个对象都有其自己的隐式管道路径,该路径在调用对象的同步方法时自动加载。如果一个线程包含在一个同步方法中,则没有其他线程可以调用同一对象的同步方法。这使您可以编写非常清晰
9、简洁的多线程代码。因为同步支持内置于语言中。11.1.3消息传递程序除以线程后,必须定义线程之间的连接。在使用大多数其他语言进行计划时,应依赖操作系统建立线程之间的通信。这当然会增加成本。但是,Java提供了一种清理多线程之间对话的低成本方法,为所有对象调用预定的方法。Java的消息传送系统允许一个线程进入一个对象的同步方法,然后等待另一个线程明确通知。11.1.4 Thread类和Runnable接口Java的多线程系统基于Thread类的方法,该类基于Runnable接口。Thread类封装线程执行。由于无法直接引用正在运行的线程的状态,因此必须通过其代理处理,因此将生成Thread实例。
10、要创建新线程,程序必须扩展Thread或实现Runnable接口。Thread类定义了多种帮助管理线程的方法。本章使用的方法见表11-1。表11-1线程管理方法方法意义GetName获取螺纹名称GetPriority获取线程优先级JsAlive检查线程是否仍在运行Join等待一个线程终止执行螺纹的入口点。Sleep将线程挂起一段时间Start调用执行方法以启动线程到目前为止,这本书应用的例子都是单线程的。本章的其馀部分介绍如何使用Thread和Runnable创建和管理线程。让我们从所有Java程序拥有的线程(主线程)开始。11.2本线当Java程序启动时,通常称为程序主线程的线程会立即运行。
11、这是因为程序启动时运行。主线程的重要性体现在以下两个方面:产生其他子系线的系线通常,您需要完成最终执行,因为它执行各种关闭行为。主线程在程序启动时自动生成,但可以由一个Thread对象控制。为此,必须调用currentThread()方法(Thread类的公共静态成员)获取其引用。一般形式如下:Static Thread currentThread()此方法返回对调用线程的引用。一旦获得了对主线程的引用,就可以像控制其他线程一样控制主线程。让我们从查看以下示例开始。/Controlling the main Thread。类currenntthreaddemopublic static voi
12、d main(string args)thread t=thread . current thread();system . out . print ln( current thread : t);/变更the name of the threadt . set name( My Thread );system . out . print ln( after name change : t);Try for(int n=5);n 0;N-)system . out . print ln(n);thread . sleep(1000); catch (interrupted exception
13、e)system . out . print ln( main thread interrupted );在此程序中,通过调用本地变量t中存储的currentThread()获取对当前线程(自然是主线程)的引用。然后,程序显示有关线程的信息。然后,程序调用setName()更改线程的内部名称。螺纹信息重新显示。然后,循环数从5开始,每隔一秒暂停一次。暂停是由sleep()方法执行的。Sleep()语句明确指定延迟为1毫秒。注意循环外部的try/catch块。Thread类的sleep()方法可以引发InterruptedException异常。当另一个线程试图干扰睡觉的线程时,会出现这种情况。
14、此范例只是列印是否中断的讯息。在实际程序中要灵活地处理这种问题。以下是此程序的输出:Current thread : thread main,5,mainafter name change : threadmythread,5,main54321在println()语句中用作参数时输出t。显示顺序:螺纹名称、优先级和组名称。默认情况下,主线程的名称为main。优先级为5,这是默认值,也是main所属线程组的名称。“线程组”(thread group)是将线程控制为整个集合状态的数据结构。此过程由专有运行时环境处理,此处不详细说明。如果螺纹名称变更,则t会再次输出。此时,将显示新螺纹名称。让我们
15、进一步了解Thread类在程序中的定义方式。Sleep()方法显示从调用线程到暂停线程的毫秒数。一般形式如下:static void sleep(long millise conds)throws interrupted exception暂停时间明确定义为毫秒。此方法可以引发InterruptedException异常。Sleep()方法还具有以下第二种形式:此方法允许您指定是以毫秒还是以纳秒指定时间。static void sleep(long millise conds,int nanosconds) throwsInterruptedException第二种形式只能在允许纳秒作为时间段
16、的情况下使用。如上面的程序所示,可以使用setName()设置线程名称,使用getName()获取线程名称。程序中未反映此过程。这些方法是Thread类的成员,声明如下:Final void set name(字符串流名称)Final String getName()其中threadName特别表示螺纹名称。11.3建设路线大多数情况下,实例化一个Thread对象以创建一个线程。Java的定义方式有两种:实现Runnable接口。可以继承Thread类。以下两部分依次说明每种方法。11.3.1 Runnable接口实施创建线程的最简单方法是创建实现Runnable接口的类。Runnable抽象执行代码单元。您可以透过实作Runnable介面的方法,建立每个物件的执行绪。要实现Runnable接口,一个类只能实现run()的简单方法,如下所示:Public void run()您可以在Run()中定义代码以配置新线程。了解以下内容很重要:run()方法与基础线程一样,可以调用其它方法、引用其它类以及声明变量。但是,run()在程序中设置其他并发线程执行门户是不同的。返回Run
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- β-Xylosidase-Lactobacillus-brevis-生命科学试剂-MCE
- 世界名著考试题及答案
- 2026陕西西安交通大学能动学院管理辅助人员招聘1人备考题库含完整答案详解(夺冠系列)
- 2026青岛掌控传媒有限公司二次招聘1人考前冲刺试卷【研优卷】附答案详解
- 2026黄海水产研究所招聘1人考前冲刺密卷附答案详解【夺分金卷】
- 2026黑龙江加格达奇区曙光街道办事处招聘就业见习人员备考题库含答案详解(满分必刷)
- 2026黑龙江齐齐哈尔富裕县市场监督管理局招聘公益性岗位人员2人备考题库附完整答案详解【典优】
- 万年县2026年县城初中学校教师选聘资格审查情况考前冲刺试卷一套附答案详解
- 修水县2026年城区学校(幼儿园)教师选调【127人】考前冲刺试卷附答案详解(基础题)
- 北京能源国际控股有限公司2027届校园招聘备考题库附参考答案详解【A卷】
- 新建铁路南疆铁路至兰新铁路联络线项目环评报告
- 预防性试验作业指导书(变电站10kv分册)
- 英语词根总结大全
- 2025年中考数学二轮复习-专题6手拉手模型【课件】
- 2023新能源集控中心建设可行性研究报告
- 厂内物流基础知识
- 现代城市商业综合体规划设计
- 燃气储罐安全拆除应急预案
- 【生物】全册教案 2023-2024学年人教版八年级生物下册
- 审计国际化进程中的问题及对策
- 民用建筑供暖通风与空气调节设计规范样本
评论
0/150
提交评论