- 1、本文档共82页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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按钮中断下载操作。下一
您可能关注的文档
最近下载
- 规范汉字书写 标点符号用法举例 标点符号用法举例.pptx VIP
- 职业院校技能大赛--Z-30“工程测量”赛项理论考试题库.doc VIP
- 安全员C证考试题库(精练).docx VIP
- 2018年四川省职业院校技能大赛工程测量赛项中职组理论考试题库.docx VIP
- 2020年山东省职业院校技能大赛中职组工程测量赛项理论试题.doc VIP
- 第十六届山东省职业院校技能大赛中职工程测量赛(教师组)理论试题.docx VIP
- 中央八项规定精神专题党课讲座PPT模板.pptx VIP
- 第十六届山东省职业院校技能大赛中职工程测量赛项(学生组)理论试题.docx VIP
- 全频带阻塞干扰刘慈欣小说读书分享PPT.pptx VIP
- 作子女生命的教练.PPT
文档评论(0)