setDaemon实例详解

Java线程分为用户线程和守护线程。守护线程优先级低,不会阻止JVM退出,常用于后台服务如垃圾回收。当所有用户线程结束,守护线程也会随之终止。在启动线程前设置setDaemon(true)可将其设为守护线程。示例中展示了未设置守护线程和设置守护线程后,线程执行的不同情况。
摘要由CSDN通过智能技术生成

Java线程区别

JAVA线程分为即实线程与守护线程,守护线程是优先级低,存活与否不影响JVM的退出的线程,实现守护线程的方法是在线程start()之前setDaemon(true),否则会抛出一个IllegalThreadStateException异常。不能操作文件、数据库等资源,避免主线程关闭而未能关闭守护线程的资源,并且它会在任何时候甚至在一个操作的中间发生中断。

作者:梦里藍天
来源:CSDN
原文:线程详解

守护线程了解

  • daemon线程所产生的所有线程都是daemon的
  • 只有虚拟机中的用户线程(非Daimon线程)全部结束,Daemon线程就会立即结束,并且也不会调用finally里的语句。
  • 在主线程关闭后无需手动关闭守护线程,因为会自动关闭
  • java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开,用于实时监控和管理系统中的可回收资源。
  • 守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
  • 它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”,依赖于jvm中的用户进程是否运行。

部分引用资料:南望孤笑

使用案例

package thread;

/**
 * @author pengchuang
 * @date 2021/9/27 10:39
 */
public class Daemon {
	static class MainThread extends Thread {
		@Override
		public void run() {
			System.out.println("MainThread is daemon? " + this.isDaemon());
			System.out.println("MainThread begin!");

			Thread sub1 = new SubThread();
			// 开启守护进程的开关
			//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");
		Thread mainThread = new MainThread();
		mainThread.start();
		try {
			mainThread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		System.out.println("Main end!");
	}
}

当我们开始setDaemon(false)时候,可以得到结果

Main begin
MainThread is daemon? false
MainThread begin!
SubThread is daemon? false
SubThread begin!
SubThread  0
SubThread  1
SubThread  2
SubThread  3
SubThread  4
Main end!
MainThread finally
MainThread end!
SubThread  5
SubThread  6
SubThread  7
SubThread  8
SubThread  9
SubThread finally
SubThread end!

当我们开始setDaemon(true)时候,可以得到结果

Main begin
MainThread is daemon? false
MainThread begin!
SubThread is daemon? true
SubThread begin!
SubThread  0
SubThread  1
SubThread  2
SubThread  3
SubThread  4
Main end!
MainThread finally
MainThread end!

我们可以得到对于守护进程而言,当用户进程运行完毕,也就是一般进程运行完毕时候,jvm关闭时,守护进程会立马中断关闭,同理,当jvm中所有进程都是守护进程时候,jvm就会退出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pengshi12138

加油加油

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值