Daemon线程

来源:互联网 发布:办公软件系统 编辑:程序博客网 时间:2024/06/14 06:45
 

如果要设计某个程序,除了主线程之外,还用了一个线程在后台进行相关运算工作,程序如下:

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线程,范例15.5是个简单的示范。

Ü 范例15.5  DaemonThread.java

package onlyfun.caterpillar;

public class DaemonThread {

    public static void main(String[] args) {

        Thread thread = new Thread(

        // 这是匿名类的写法

            new Runnable() {

                public void run() {

                    while(true) {

                        System.out.print("T");

                    }

                }        

            });

        // 设置为Daemon线程

        thread.setDaemon(true);

        thread.start();

    }

}

这个程序在主线程结束之后,Daemon线程也就会跟着结束,您可以使用setDaemon()方法来设置一个线程是否为Daemon线程,范例15.5中如果没有使用setDaemon()方法设置为true,则程序会不断地打印出T字符而不终止(只能按Ctrl+C强迫中止程序);使用isDaemon()方法则可以判断该线程是否为Daemon线程。

Java默认所有从Daemon线程产生的线程也是Daemon线程,因为基本上由一个后台服务线程衍生出来的线程,也应该是为了在后台服务而产生的,所以在产生它的线程停止后,衍生线程也应该跟着停止。

原创粉丝点击