友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第214章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




    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();  

      }  



                                                                                             496 


…………………………………………………………Page 498……………………………………………………………

    }  

  }  

  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)的描述内容 

中:  

  

  

  

其中,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 中的标记,一旦对应线程以后需要修改这个标记,它会作出相应的反 

应。  

这个例子的一个好处是它使我们能够方便地创建由单独子任务构成的大型集合,并以监视它们的行为。在这 

种情况下,我们会发现随着子任务数量的增多,机器显示出来的数字可能会出现更大的分歧,这是由于为线 

程提供服务的方式造成的。  



                                                                                       497 


…………………………………………………………Page 499……………………………………………………………

亦可试着体验一下 sleep(100)在 Ticker。run()中的重要作用。若删除 sleep(),那么在按下一个切换按钮 

前,情况仍然会进展良好。按下按钮以后,那个特定的线程就会出现一个失败的 runFlag,而且 run()会深深 

地陷入一个无限循环——很难在多任务处理期间中止退出。因此,程序对用户操作的反应灵敏度会大幅度降 

低。  



14。1。5 Daemon 线程  



 “Daemon”线程的作用是在程序的运行期间于后台提供一种“常规”服务,但它并不属于程序的一个基本部 

分。因此,一旦所有非 Daemon 线程完成,程序也会中止运行。相反,假若有任何非 Daemon 线程仍在运行 

 (比如还有一个正在运行main()的线程),则程序的运行不会中止。  

通过调用 isDaemon(),可调查一个线程是不是一个Daemon,而且能用 setDaemon()打开或者关闭一个线程的 

Daemon 状态。如果是一个 Daemon 线程,那么它创建的任何线程也会自动具备Daemon 属性。  

下面这个例子演示了Daemon 线程的用法:  

  

//: Daemons。java  

// Daemonic behavior  

import java。io。*;  

  

class Daemon extends Thread {  

  private static final int SIZE = 10;  

  private Thread'' t = new Thread'SIZE';  

  public Daemon() {   

    setDaemon(true);  

    start();  

  }  

  public void run() {  

    for(int i = 0; i 《 SIZE; i++)  

      t'i' = new DaemonSpawn(i);  

    for(int i = 0; i 《 SIZE; i++)  

      System。out。println(  

        〃t'〃 + i + 〃'。isDaemon() = 〃   

        + t'i'。isDaemon());  

    while(true)   

      yield();  

  }  

}  

  

class DaemonSpawn extends Thread {  

  public DaemonSpawn(int i) {  

    System。out。println(  

      〃DaemonSpawn 〃 + i + 〃 started〃);  

    start();  

  }  

  public void run() {  

    while(true)   

      yield();  

  }  

}  

  

public class Daemons {  

  public static void main(String'' args) {  

    Thread d = new Daemon();  

    System。out。println(  



                                                                                             498 


…………………………………………………………Page 500……………………………………………………………

      〃d。isDaemon() = 〃 + d。isDaemon());  

    // Allow the daemon threads to finish  

    // their startup proces
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!