守护线程和非守护线程

基本概念

  • 守护线程:和主线程一起结束的线程,叫守护线程。
  • 非守护线程:主线程的结束不影响线程的执行的线程,也叫用户线程。

如何将一个线程t变成守护线程

调用t.setDaemon(true)方法将非守护线程变为守护线程。;

示例代码

  • 非守护线程:
Thread t = new Thread(new Runnable() {
            public void run() {
                // TODO Auto-generated method stub
                for(int i=1 ; i<=10 ; i++){
                    try {
                        Thread.sleep(500);//线程休眠500毫秒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } 
                    System.out.println("子线程执行"+i+"次");
                }
            }
        }) ;
        t.start();
        for(int i=1 ; i<=5 ; i++){
            System.out.println("主线程执行"+i+"次");
        }
    }

运行结果:

主线程执行1次
主线程执行2次
主线程执行3次
主线程执行4次
主线程执行5次
子线程执行1次
子线程执行2次
子线程执行3次
子线程执行4次
子线程执行5次
子线程执行6次
子线程执行7次
子线程执行8次
子线程执行9次
子线程执行10次

由结果可以看出主线程的正常结束并不会影响子线程t的执行,子线程t继续执行。
- 守护线程

Thread t = new Thread(new Runnable() {
            public void run() {
                // TODO Auto-generated method stub
                for(int i=1 ; i<=10 ; i++){
                    try {
                        Thread.sleep(30);//线程休眠500毫秒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } 
                    System.out.println("子线程执行"+i+"次");
                }
            }
        }) ;
        t.setDaemon(true) ; //将子线程t设置为守护线程
        t.start();
        for(int i=1 ; i<=5 ; i++){
            try {
                Thread.sleep(30);//线程休眠500毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            } 
            System.out.println("主线程执行"+i+"次");
        }
    }

执行结果:

主线程执行1次
子线程执行1次
主线程执行2次
子线程执行2次
主线程执行3次
子线程执行3次
主线程执行4次
子线程执行4次
主线程执行5次

由结果可以看出主线程结束后,设置为守护线程的子线程将不再执行。

猜你喜欢

转载自blog.csdn.net/u013634252/article/details/80531044