返回介绍

14.1.5 Daemon 线程

发布于 2024-10-15 23:56:32 字数 1908 浏览 0 评论 0 收藏 0

“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(
      "d.isDaemon() = " + d.isDaemon());
    // Allow the daemon threads to finish
    // their startup processes:
    BufferedReader stdin =
      new BufferedReader(
        new InputStreamReader(System.in));
    System.out.println("Waiting for CR");
    try {
      stdin.readLine();
    } catch(IOException e) {}
  }
} ///:~

Daemon 线程可将自己的 Daemon 标记设置成“真”,然后产生一系列其他线程,而且认为它们也具有 Daemon 属性。随后,它进入一个无限循环,在其中调用 yield(),放弃对其他进程的控制。在这个程序早期的一个版本中,无限循环会使 int 计数器增值,但会使整个程序都好象陷入停顿状态。换用 yield() 后,却可使程序充满“活力”,不会使人产生停滞或反应迟钝的感觉。

一旦 main() 完成自己的工作,便没有什么能阻止程序中断运行,因为这里运行的只有 Daemon 线程。所以能看到启动所有 Daemon 线程后显示出来的结果,System.in 也进行了相应的设置,使程序中断前能等待一个回车。如果不进行这样的设置,就只能看到创建 Daemon 线程的一部分结果(试试将 readLine() 代码换成不同长度的 sleep() 调用,看看会有什么表现)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文