日期:2011-03-22 16:16:00 来源:本站整理
<b>反映矫捷的用户界面</b>[Java编程]
本文“<b>反映矫捷的用户界面</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
作为我们的起点,请考虑一个需求履行某些CPU密集型计算的程序.由于CPU“诚心诚意”为那些计算服务,所以对用户的输入非常愚钝,几近没有什么反映.在这里,我们用一个合成的applet/application(程序片/利用程序)来简单显示出一个计数器的后果:
在这个程序中,AWT和程序片代码都应是大家熟习的,第13章对此已有很具体的交代.go()办法恰是程序诚心诚意服务的对待:将当前的count(计数)值置入TextField(文本字段)t,然后使count增值.//: Counter1.java // A non-responsive user interface package c14; import java.awt.*; import java.awt.event.*; import java.applet.*; public class Counter1 extends Applet { private int count = 0; private Button onOff = new Button("Toggle"), start = new Button("Start"); private TextField t = new TextField(10); private boolean runFlag = true; public void init() { add(t); start.addActionListener(new StartL()); add(start); onOff.addActionListener(new OnOffL()); add(onOff); } public void go() { while (true) { try { Thread.currentThread().sleep(100); } catch (InterruptedException e){} if(runFlag) t.setText(Integer.toString(count++)); } } class StartL implements ActionListener { public void actionPerformed(ActionEvent e) { go(); } } class OnOffL implements ActionListener { public void actionPerformed(ActionEvent e) { runFlag = !runFlag; } } public static void main(String[] args) { Counter1 applet = new Counter1(); Frame aFrame = new Frame("Counter1"); aFrame.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); aFrame.add(applet, BorderLayout.CENTER); aFrame.setSize(300,200); applet.init(); applet.start(); aFrame.setVisible(true); } } ///:~
go()内的部份无限循环是调用sleep().sleep()必须同一个Thread(线程)对象关联到一同,并且仿佛每个利用程序都有部份线程同它关联(事实上,Java本身就是成立在线程底子上的,必定有一些线程会伴随我们写的利用一同运行).所以无论我们能否明确利用了线程,都可操纵Thread.currentThread()产生由程序利用的当前线程,然后为那个线程调用sleep().注意,Thread.currentThread()是Thread类的一个静态办法.
注意sleep()大概“掷”出一个InterruptException(中止违例)——固然产生这样的违例被认为是中止线程的一种“恶意”手段,并且应当尽大概地根绝这一做法.再次提醒大家,违例是为非常情形而产生的,而不是为了正常的掌握流.在这里包含了对一个“就寝”线程的中止,以支持将来的一种语言特点.
一旦按下start按钮,就会调用go().研究一下go(),你大概会很自然地(就象我一样)认为它该支持多线程,因为它会进入“就寝”状况.也就是说,固然办法本身“睡着”了,CPU仍旧应当忙于监督其他按钮“按下”事件.但有一个问题,那就是go()是永久不会返回的,因为它被计划成一个无限循环.这意味着actionPerformed()根本不会返回.由于在第一个按键今后便陷入actionPerformed()中,所以程序不能再对其他任何事件举行掌握(假如想出来,必须以某种方法“杀死”进程——最简便的方法就是在掌握台窗口按Ctrl+C键).
这里最基本的问题是go()需求持续履行自己的操作,而与此同时,它也需求返回,以便actionPerformed()可以完成,并且用户界面也能持续呼利用户的操作.但对象go()这样的传统办法来说,它却不能在持续的同时将掌握权返回给程序的其他部份.这听起来仿佛是一件不大概做到的事情,就象CPU必须同时位于两个地方一样,但线程可以办理一切.“线程模子”(以及Java中的编程支持)是一种程序编写标准,可在单独一个程序里实现几个操作的同时举行.按照这一机制,CPU可为每个线程都分配自己的一部份时间.每个线程都“感受”自己好象拥有整个CPU,但CPU的计算时间实际倒是在全部线程间分摊的.
线程机制多少降低了一些计算效率,但无论程序的计划,资源的均衡,还是用户操作的便利性,都从中得到了宏大的好处.综合考虑,这一机制是非常有代价的.当然,假如本来就安装了多块CPU,那么操作系统可以自行决意为差别的CPU分配哪些线程,程序的总体运行速度也会变得更快(全部这些都要求操作系统以及利用程序的支持).多线程和多任务是充分施展多处理机系统本领的一种最有效的方法.
以上是“<b>反映矫捷的用户界面</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java按钮的制作
- ·下一篇文章:<b>多线程</b>
- ·中查找“<b>反映矫捷的用户界面</b>”更多相关内容
- ·中查找“<b>反映矫捷的用户界面</b>”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论