ITEEDU

入门准备

接触对象

对象导向

资源管理

对象容器(Container)

输入输出(I/O)

执行绪(Thread)

反射(Reflection)

metadata

数据库(JDBC)

舍遗补缺

Java Gossip: Daemon 执行绪

您想要设计一个程序,除了主执行绪之外,其运用了一个执行绪于背景进行相关运算工作,您的程序可能像是这样:

SimpleThread.java
package onlyfun.caterpillar;
public class SimpleThread {
	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				while(true) {
					System.out.print("T");
				}
			}
		});
		thread.start();
		// 主执行绪继续进行其它工作........
		// such...such....
		// 现在主执行绪执行到这边了,工作应该结束了
	}
}

您的执行绪已经运行到最后一个陈述了,这时应该是工作结束的时候,但您的另一个执行绪还在运作,您怎么停止它?在最后加上一行使用System.exit ()?这虽然也可以,但这只是强迫程序结束,而且这个方法并不是随时可以适用!

一个Daemon执行绪是一个在背景执行服务的执行绪,例如网络服务器倾听连接端口的服务、隐藏的系统执行绪如垃圾收集执行绪或其它JVM 建立的执行绪,如果所有的非Daemon的执行绪都结束了,则Daemon执行绪自动就会终止。

从Main函式开始的是一个非Daemon执行绪,如果您希望某个执行绪在非Daemon执行绪都结束后也跟着终止,那么您要将它设定为Daemon执行 绪,下面这个程序是个简单的示范:

DaemonTest.java
package onlyfun.caterpillar;
public class DaemonTest {
	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				while(true) {
					System.out.print("T");
				}
			}?
		});
		thread.setDaemon(true);
		thread.start();
	}
}

这个程序在主执行绪结束之后,Daemon也就跟着结束了,所以它不会像上面这个程序,不断的打印T字符;您可以使用setDaemon()方法来设定一 个执行绪是否为Daemon执行绪,使用isDaemon()方法则可以判断该执行绪是否为Daemon执行绪。

基本上,Java预设所有从Daemon执行绪产生的执行绪也是Daemon执行绪,这很直觉,由一个背景服务执行绪衍生出来的执行绪,也应该是为了在背 景服务而产生的,所以在该停止时也应该停止。