从头认识多线程-1.17 守护线程setDaemon()

这一章节我们来讨论一下守护线程。

1.特性

守护线程是需要等待其他用户线程结束后才结束的线程,俗称保姆线程


2.源码解析

/**
     * Marks this thread as either a {@linkplain #isDaemon daemon} thread
     * or a user thread. The Java Virtual Machine exits when the only
     * threads running are all daemon threads.
     *
     * <p> This method must be invoked before the thread is started.
     *
     * @param  on
     *         if {@code true}, marks this thread as a daemon thread
     *
     * @throws  IllegalThreadStateException
     *          if this thread is {@linkplain #isAlive alive}
     *
     * @throws  SecurityException
     *          if {@link #checkAccess} determines that the current
     *          thread cannot modify this thread
     */
    public final void setDaemon(boolean on) {
        checkAccess();
        if (isAlive()) {
            throw new IllegalThreadStateException();
        }
        daemon = on;
    }

其实就是设置一个默认值

我们从注释那里可以看到,jvm是在所有前台的用户线程完毕后才退出的,而这里面不管后台开了多少个守护线程

而且设置守护线程必须在start()之前


3.演示守护线程

package com.ray.deepintothread.ch01.topic_17;

public class DaemonSample2 {
	public static void main(String[] args) throws InterruptedException {
		ThreadFour threadFour = new ThreadFour();
		threadFour.start();
		ThreadTwo threadTwo = new ThreadTwo();
		threadTwo.setDaemon(true);
		threadTwo.start();
	}
}

class ThreadFour extends Thread {

	@Override
	public void run() {
		while (true) {
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

class ThreadTwo extends Thread {

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + " start");
	}
}

输出:

Thread-1 start


4.守护线程的坑

需要我们切记的一点是:不要把逻辑处理放到守护线程里面

一般守护线程都是放调度器一类的东西


代码清单:

package com.ray.deepintothread.ch01.topic_17;

public class DaemonSample {
	public static void main(String[] args) throws InterruptedException {
		Thread.sleep(1000);
		ThreadOne threadOne = new ThreadOne();
		threadOne.setDaemon(true);
		threadOne.start();
	}
}

class ThreadOne extends Thread {

	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println(i);
		}
	}
}
输出:

(无)


为什么没有输出呢?

上面的执行是这样的:

(1)main线程起来,他的工作只是等待1秒

(2)在main线程起来的同时,另一个线程也起来,而且被设置为守护线程

(3)当main线程的等待时间结束,那么整个程序的用户就已经结束了,剩下的只是守护线程

(4)当main线程结束的同时,守护线程也结束,因此来不及打印,就已经把线程关掉了


因此,上面是打印不了东西的,同理,不要把逻辑处理放到守护线程里面


总结:这一章节介绍了一下守护线程以及他的坑。


我的github:https://github.com/raylee2015/DeepIntoThread

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值