日期:2011-03-22 16:16:00 来源:本站整理
java制作多个线程[Java编程]
本文“java制作多个线程[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
目前考虑一下成立多个差别的线程的问题.我们不可用前面的例子来做到这一点,所以必须倒退回去,操纵从Thread担当的多个独立类来封装run().但这是一种更通例的筹划,并且更易理解,所以固然前例揭露了我们常常都能看到的编码款式,但并不举荐在大大都情形下都那样做,因为它只是略微复杂一些,并且机动性稍低一些.
下面这个例子用计数器和切换按钮再现了前面的编码款式.但这一次,一个特定计数器的全部信息(按钮和文本字段)都位于它自己的、从Thread担当的对象内.Ticker中的全部字段都具有private(私有)属性,这意味着Ticker的具体实现筹划可按照实际情形肆意改正,此中包含改正用于获得和显示信息的数据组件的数目及范例.成立好一个Ticker对象今后,构建器便恳求一个AWT容器(Container)的句柄——Ticker用自己的可视组件填充那个容器.采取这种方法,今后一旦改变了可视组件,利用Ticker的代码便不需求另行改正一道.
//: Counter4.java // If you separate your thread from the main // class, you can have as many threads as you // want. import java.awt.*; import java.awt.event.*; import java.applet.*; class Ticker extends Thread { private Button b = new Button("Toggle"); private TextField t = new TextField(10); private int count = 0; private boolean runFlag = true; public Ticker(Container c) { b.addActionListener(new ToggleL()); Panel p = new Panel(); p.add(t); p.add(b); c.add(p); } class ToggleL implements ActionListener { public void actionPerformed(ActionEvent e) { runFlag = !runFlag; } } public void run() { while (true) { if(runFlag) t.setText(Integer.toString(count++)); try { sleep(100); } catch (InterruptedException e){} } } } public class Counter4 extends Applet { private Button start = new Button("Start"); private boolean started = false; private Ticker[] s; private boolean isApplet = true; private int size; public void init() { // Get parameter "size" from Web page: if(isApplet) size = Integer.parseInt(getParameter("size")); s = new Ticker[size]; for(int i = 0; i < s.length; i++) s[i] = new Ticker(this); start.addActionListener(new StartL()); add(start); } class StartL implements ActionListener { public void actionPerformed(ActionEvent e) { if(!started) { started = true; for(int i = 0; i < s.length; i++) s[i].start(); } } } public static void main(String[] args) { Counter4 applet = new Counter4(); // This isn't an applet, so set the flag and // produce the parameter values from args: applet.isApplet = false; applet.size = (args.length == 0 ? 5 : Integer.parseInt(args[0])); Frame aFrame = new Frame("Counter4"); aFrame.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); aFrame.add(applet, BorderLayout.CENTER); aFrame.setSize(200, applet.size * 50); applet.init(); applet.start(); aFrame.setVisible(true); } } ///:~
Ticker不但包含了自己的线程处理机制,也供应了掌握与显示线程的工具.可按自己的志愿成立肆意数目的线程,毋需明确地成立窗口化组件.
在Counter4中,有一个名为s的Ticker对象的数组.为得到最大的机动性,这个数组的长度是用程序片参数接触Web页而初始化的.下面是网页中长度参数大致的模样,它们嵌于对程序片(applet)的描写内容中:
<applet code=Counter4 width=600 height=600>
<param name=size value="20">
</applet>
此中,param,name和value是全部Web页都实用的关键字.name是指程序中对参数的一种引用称谓,value可以是任何字串(并不但仅是解析成一个数字的东西).
我们注意到对数组s长度的判断是在init()内部完成的,它没有作为s的内嵌定义的一部份供应.换言之,不可将下述代码作为类定义的一部份利用(应当位于任何办法的外部):
inst size = Integer.parseInt(getParameter("Size"));
Ticker[] s = new Ticker[size]
可把它编译出来,但会在运行期得到一个空指针违例.但假如将getParameter()初始化移入init(),则可正常工作.程序片框架会举行必要的启竣工作,以便在进入init()前汇集好一些参数.
此外,上述代码被同时设置成一个程序片和一个利用(程序).在它是利用程序的情形下,size参数可从号令行里提取出来(不然就供应一个默许的值).
数组的长度建好今后,便可以成立新的Ticker对象;作为Ticker构建器的一部份,用于每个Ticker的按钮和文本字段就会加入程序片.
按下Start按钮后,会在整个Ticker数组里遍历,并为每个Ticker调用start().记着,start()会举行必要的线程初始化工作,然后为那个线程调用run().
ToggleL监督器只是简单地切换Ticker中的标志,一旦对应线程今后需求改正这个标志,它会作出呼应的反映.
这个例子的一个好处是它使我们可以便利地成立由单独子任务构成的大型调集,并以监督它们的行为.在这种情形下,我们会发现随着子任务数目的增添,机械显示出来的数字大概会呈现更大的不合,这是由于为线程供应服务的方法造成的.
亦可试着体验一下sleep(100)在Ticker.run()中的重要作用.若删除sleep(),那么在按下一个切换按钮前,情形仍旧会进展杰出.按下按钮今后,那个特定的线程就会呈现一个失利的runFlag,并且run()会深深地陷入一个无限循环——很难在多任务处理期间中止退出.因此,程序对用户操作的反映矫捷度会大幅度降低.
以上是“java制作多个线程[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:Daemon线程
- ·下一篇文章:用主类归并线程
- ·中查找“java制作多个线程”更多相关内容
- ·中查找“java制作多个线程”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论