- 写在前面的话
- 引言
- 第 1 章 对象入门
- 第 2 章 一切都是对象
- 第 3 章 控制程序流程
- 第 4 章 初始化和清除
- 第 5 章 隐藏实施过程
- 第 6 章 类再生
- 第 7 章 多形性
- 第 8 章 对象的容纳
- 第 9 章 违例差错控制
- 第 10 章 Java IO 系统
- 第 11 章 运行期类型鉴定
- 第 12 章 传递和返回对象
- 第 十三 章 创建窗口和程序片
- 第 14 章 多线程
- 第 15 章 网络编程
- 第 16 章 设计范式
- 第 17 章 项目
- 附录 A 使用非 JAVA 代码
- 附录 B 对比 C++和 Java
- 附录 C Java 编程规则
- 附录 D 性能
- 附录 E 关于垃圾收集的一些话
- 附录 F 推荐读物
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
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( "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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论