Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

线程8--守护线程Daemon

Posted on 2009-06-02 21:26 啥都写点 阅读(274) 评论(0)  编辑  收藏 所属分类: J2SE
关键技术:
  • Thread的setDaemon实例方法设置线程是否为守护线程,参数为true表示该线程为守护线程。
  • 线程被运行后,setDaemon实例方法无效,即必须在调用start方法之前调用setDaemon方法,才能设置线程为守护线程。
  • 程序中启动的线程默认为非守护线程,但在守护线程中启动的线程都是守护线程。
  • 当程序中所有非守护线程都结束时,守护线程无条件地被立即结束。

package book.thread;

/**
 * Daemon(守护)线程 
 * Daemon线程区别一般线程之处是: 
 * 只有虚拟机中的用户线程(非Daimon线程)全部结束,Daemon线程就会立即结束,并且也不会调用finally里的语句。
 * daemon线程所产生的所有线程都是daemon的
 
*/
public class Daemon {

    
static class MainThread extends Thread {

        
public void run() {
            System.out.println(
"MainThread is daemon? " + this.isDaemon());
            System.out.println(
"MainThread begin!");
            
//启动子线程
            Thread sub1 = new SubThread();
            
//sub1线程为守护线程
            sub1.setDaemon(true);
            sub1.start();
            
try {
                Thread.sleep(
1000);
            }
catch (InterruptedException e) {
                e.printStackTrace();
            } 
finally {
                System.out.println(
"MainThread" + " finally");
            }
            System.out.println(
"MainThread end!");
        }
    }

    
static class SubThread extends Thread {

        
public void run() {
            System.out.println(
"SubThread is daemon? " + this.isDaemon());
            System.out.println(
"SubThread begin!");
            
int i = 0;
            
try {
                
while (i < 10) {
                    System.out.println(
"SubThread  " + i++);
                    Thread.sleep(
200);
                }
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            } 
finally {
                System.out.println(
"SubThread finally");
            }
            System.out.println(
"SubThread end!");
        }
    }

    
public static void main(String[] args) {
        System.out.println(
"Main begin!");
        
//默认情况下mainThread是普通线程
        Thread mainThread = new MainThread();
        
//启动mainThread线程
        mainThread.start();
        
try {
            Thread.sleep(
500);
        } 
catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        System.out.println(
"Main end!");
    }
}




                                                                                                       --    学海无涯