多线程之守护线程

一、守护线程介绍

线程分为用户线程和守护线程,而守护线程就是为用户线程服务的一种线程,一般具有较低的优先级,用户线程停止,守护线程也就停止了。

举个例子:你在看电视,那么你在看电视可以作为一个用户线程,而电视机运行则就是守护线程,而你不看电视了自然就会关掉电视机。

二、如何创建守护线程

创建守护线程有两种方式:

  • 线程实例.setDaemon(true)(也就是直接设置当前线程为守护线程)
  • Timer timer = new Timer(true)(实际上是声明当前线程为守护线程)

这里有需要注意的是

  • setDaemon(true)必须在调用线程的start()方法之前设置,否则会抛出IllegalThreadStateException异常。
  • 在守护线程中产生的新线程也是守护线程。
  • 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。(主要是因为可能没运行完就被杀掉了)
package com.rong.Thread;
/**
  *      守护线程
 * @author Administrator
 * 非守护线程结束后,守护线程也会耕者结束,可以说守护线程是为非守护线程进行服务的
 *
 */
public class ThreadDaemon {

	public static void main(String[] args) {
		
		//守护线程
		Thread t1 = new Thread() {
			public void run() {
				for(int  i = 0; i<100; i++) {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
					System.out.println("守护线程");
				}
			}
		};
		
		//非守护线程
		Thread t2 = new Thread() {
			public void run() {
				int i;
				for( i = 0; i<=5; i++) {
					try {
						Thread.sleep(1100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				    System.out.println("非守护线程"+"--"+i);
				}
			}
		};
		t1.setDaemon(true);//设置t1为守护线程
		t1.start();
		t2.start();
	}

}

运行结果:
/**
 守护线程
非守护线程--0
守护线程
非守护线程--1
守护线程
非守护线程--2
守护线程
非守护线程--3
守护线程
非守护线程--4
守护线程
非守护线程--5
**/

我们设置守护线程输出100次,而用户线程输出6次,当用户线程打印6次后,守护线程也不再输出了,也就是说停止了。

至于Timer类,如果不声明它为守护线程,那么当前线程就不会停止。

package com.rong.test;
import java.util.*;
/**
 * MyTime类
 * @author Administrator
 *
 */
public class MyTime extends TimerTask {

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

package com.rong.test;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Test {

	public static void main(String[] args) throws InterruptedException {			
		System.out.println("系统当前时间:"+new Date());
		  Calendar calendar = Calendar.getInstance();
		  calendar.add(Calendar.SECOND, 20);//当前时间后,不然守护线程也执行完了
		  Date date = calendar.getTime();
		  MyTime task = new MyTime();
		  Timer timer = new Timer(true);
		  timer.schedule(task, date);
	}
}

执行结果:系统当前时间:Sat Feb 15 12:00:34 CST 2020

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值