java基础——守护线程

守护线程

1.守护线程和非守护线程(用户线程)

Java分为两种线程:用户线程和守护线程守护线程 是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。守护线程和用户线程的没啥本质的区别:唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意一下几点:

  • thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
  • 在Daemon线程中产生的新线程也是Daemon的。
  • 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。
1.非守护线程和主线程
/**
 * 守护线程和非守护线程与主线程的关系
 * 用户线程是主线程创建的,它是非守护线程。
 * 守护线程和主线程一起销毁
 * @author duqingqing
 * @date 2018年9月24日
 */
public class DaemonThread {
	public static void main(String[] args) {
		//thread1是用户线程,是主线程创建的
		Thread thread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=0;i<15;i++)
				{
					try {
						Thread.sleep(300);
					} catch (Exception e) {
						// TODO: handle exception
					}
					System.out.println("子线程 :"+i);
				}
			}
		});
		thread1.start();
		//主线程
		for(int j=0;j<5;j++) {
			try {
				Thread.sleep(300);
			} catch (Exception e) {
				// TODO: handle exception
			}
			System.out.println("主线程 :"+j);
		}
		System.out.println("主线程完毕...");
	}
}

子线程 :0 主线程 :0 主线程 :1 子线程 :1 子线程 :2 主线程 :2 主线程 :3 子线程 :3 主线程 :4 子线程 :4主线程完毕...
子线程 :5 子线程 :6 子线程 :7 子线程 :8 子线程 :9 子线程 :10 子线程 :11 子线程 :12 子线程 :13 子线程 :14

非守护线程不会受主线程的影响

2.守护线程和主线程的关系
/**
 * 守护线程和非守护线程与主线程的关系
 * 用户线程是主线程创建的,它是非守护线程。
 * 守护线程和主线程一起销毁
 * @author duqingqing
 * @date 2018年9月24日
 */
public class DaemonThread {
	public static void main(String[] args) {
		//thread1是用户线程,是主线程创建的
		Thread thread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=0;i<15;i++)
				{
					try {
						Thread.sleep(300);
					} catch (Exception e) {
						// TODO: handle exception
					}
					System.out.print(" 子线程 :"+i);
				}
			}
		});
		thread1.setDaemon(true);//设置为守护线程
		thread1.start();
		//主线程
		for(int j=0;j<5;j++) {
			try {
				Thread.sleep(300);
			} catch (Exception e) {
				// TODO: handle exception
			}
			System.out.print(" 主线程 :"+j);
		}
		System.out.println("主线程完毕...");
	}
}

 主线程 :0 子线程 :0 子线程 :1 主线程 :1 子线程 :2 主线程 :2 子线程 :3 主线程 :3 主线程 :4主线程完毕...
 子线程 :4

主线程销毁,守护线程销毁。

猜你喜欢

转载自blog.csdn.net/qq_37339399/article/details/85040456
今日推荐