第14章多线程.doc

  1. 1、本文档共82页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第14章 多线程 ▲线程的概念 ▲线程安全的集合 ▲中断线程 ▲Callable与Future ▲线程属性 ▲执行器 ▲同步 ▲线程与Swing ▲阻塞队列 读者可能很熟悉操作系统中的多任务(multitasking):在同一刻运行多个程序的能力。例如,在编辑或下载邮件的同时可以打印文件。今天,人们很可能拥有单台拥有多个CPU的计算机,但是,并发执行的进程数目并不是由CPU数目制约的。操作系统将CPU的时间片分配给每一个进程,个人并行处理的感觉。 多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。通常,每一个任务称为一个线程(thread),它是线程控制的简称。可以同时运行一个以上的程序称为多线程程序(multithreaded)。 然而,多线程与多进程有哪些区别呢?本质区别在于每个进程拥有自己的一整套变量,而线程则共享数据。这听起来似乎有些风险,的确也是这样,在本章稍后将可以看到这个问题。然而,共享变量使线程之间的通信比进程之间的通信更有效、更容易。此外,有些操作系统中,与进程相比较,线程更“轻量级”,创建、撤销一个线程比启动新进程的开销要小的多。 在实际应用中,多线程非常有用。例如,一个浏览器可以同时下载几幅图片。一个Web服务器需要同时处理几个并发的请求。图形用户界面(GUI)程序用一个独立的线程从宿主操作环境中收集用户界面的事件。本章将介绍如何为Java应用程序添加多线程能力。 在Java SE 5.0 中,多线程发生了重大的变化,并增加了大量的类和接口,为大多数应用程序员所需要的多线程机制提供了高质量的实现。本章将介绍Java SE 5.0新增的特性以及类的同步机制,并帮助大家从中做出适当的选择。 温馨提示:多线程可能会变得相当复杂。本章涵盖了应用程序可能需要的所有工具。尽管如此,对于更复杂的系统级程序设计,建议参看更高级的参考文献,例如:Brian Goetz(Addison-Wesley Professional,2006)的《Java Concurrency in Practice》。 14.1 线程的概念 这里从察看一个没有使用过多线程的程序开始。用户很难让它执行多个任务。在对其进行剖析之后,将展示让这个程序运行几个彼此多了的多个线程是很容易的。这个程序采用不断移动位置的方式实现跳动的动画效果,如果发现球碰到墙壁,将进行更新(见图14-1)。 当点击Start按钮时,程序将从屏幕的左上角弹出一个球,这个球便开始弹跳。Start按钮的处理程序将调用addBall方法。这个方法循环运行1000次move。每调用一次move,球就会移动一点,当碰到壁时,球将调整方向,并重新绘制面板。 Ball ball=new Ball(); panel.add(ball); for(int i=1;i=STEPS;i++) { ball.move(panel.getBounds()); panel.pain(panel.getGraphics()); Thread.sleep(DELAY); } Thread类的静态sleep方法暂停给定的毫秒数。 调用Thread.sleep不会创建一个新线程,sleep是Thread类的静态方法,用于暂停当前线程的活动。 sleep方法可以抛出一个InterruptedException异常,但是,这个程序完全控制了整个应用程序。如果你在球完成1000次弹跳之前已经感觉到厌倦了,并点击Close按钮会发现球仍然还在弹跳。在球自己结束弹跳之前无法与程序进行交互。 注释:如果仔细地阅读本节末尾的代码会看到BounceFrame类的addBall方法中有调用 comp.pain(comp.getGraphics()) 这一点很奇怪。一般来说,应该调用repaint方法让AWT获得图形上下文并负责绘制。但是,如果试图在这个程序中调用comp.repaint()会发现没有重画面板,这是因为addBall方法完全掌握着控制权。另外,还要注意ball组件扩增仪JPanel;这会让擦除背景变得非常容易。接下来的程序使用一个专门的线程计算球的位置,并会重新使用大家熟悉的repaint和JComponent。 显然,这个程序的性能相当糟糕。人们肯定不愿意让程序用这种方式完成一个非常耗时的工作。毕竟,当通过网络连接读取数据时,阻塞其他任务时经常发生的,有时确实想要中断读取操作。例如,下载一幅大图片。但看到一部分图片后,决定不需要或不想再看剩余的部分了,此时,肯定希望能够点击Stop按钮中断下载操作。下一

文档评论(0)

yan666888 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档