详解Java线程-守护线程与用户线程
干java开发这么多年,之前一直没留意java进程还区分守护进程和用户进程。守护进程这个概念最早还是在linux系统中接触的,直到近期使用java开发心跳检测功能时,使用Timer时才发现原来java也有守护线程的概念。
1.Java线程
1.1守护线程与用户线程
Java线程分为守护线程(DaemonThread)和用户线程(UserThread)两类.
- 通常情况下,我们使用Thread创建的线程在默认情况下都属于用户线程,当在启动线程之前,执行thread.setDaemon(true)时,线程会变成守护线程。
- 其实在本质上,用户线程和守护线程并没有太大区别,唯一的区别就是会影响虚拟机的退出(程序的终止)。当jvm中只剩下守护线程时,虚拟机会退出,及程序终止;而当jvm中至少拥有一个用户线程时,jvm都不会退出。
1.2守护线程特点
Java中的守护线程和linux中的守护进程还是有些区别的,linux守护进程时系统级别的,当系统退出时,才会终止.而java中的守护线程时jvm级别的,当jvm中无任何用户进程时,守护进程销毁,jvm退出,程序终止.笔者认为java守护进程的最主要的特点有:
- 守护进程是运行在程序后台的线程
- 守护进程创建的进程,依然时守护进程
- 守护进程不会影响jvm的退出,当jvm只剩余守护进程时,jvm进行退出
- 守护进行在jvm退出时,自动销毁
在开发java守护线程时,需要注意:
- 在线程启动之前,及执行thread.start()方法前,设置thread.setDemon(true);
- 在守护线程中启动的子线程也是守护线程
- 守护线程不建议进行写操作,因为守护进程随时可能结束。
1.3守护线程适用场景
针对于守护线程的特点,笔者认为,java守护线程通常可用于开发一些为其它用户线程服务的功能。比如说心跳检测,事件监听等。Java中最有名的守护进程当属GC(垃圾回收)
2.java守护线程开发
开发守护进程时需要注意两点:
- 必须在线程启动之前,即执行thread.start()方法前,执行thread.setDaemon(true)方法,否则会抛出异常IllegalThreadStateException
- 守护线程中创建的线程也是守护线程
2.1测试程序退出
- 注释thread.setDaemon(true)时,线程为用户线程,程序进行无线循环,程序不终止。
- 设置thread.setDaemon(true)后,线程变成守护线程,程序直接终止,仅输出一行信息"mainthreaddone"。因为程序执行完system语句之后,main程序作为唯一的一个用户线程执行结束了,jvm中只剩下一个守护进程,所以jvm便退出了。
publicclassTestThread{ publicstaticvoidmain(String[]args){ AnsyTaskansyTask=newAnsyTask(); Threadthread=newThread(ansyTask); //设置线程为异步线程 //thread.setDaemon(true); //启动线程 thread.start(); System.out.println("mainthreaddone"); } } classAnsyTaskimplementsRunnable{ @Override publicvoidrun(){ while(true){ System.out.println(LocalDateTime.now()+"-hello,thread"); } } }
2.2测试守护线程中创建新的线程
测试会发现,默认情况下,守护线程创建的子线程依然是守护线程,用户创建的守护线程依然时用户线程。也可以在创建子线程时通过setDaemon()方法修改.
publicclassTestThread{ publicstaticvoidmain(String[]args)throwsInterruptedException{ AnsyTaskansyTask=newAnsyTask(); Threadthread=newThread(ansyTask); //设置线程为异步线程 thread.setDaemon(true); //启动线程 thread.start(); //给守护线程点儿执行时间 Thread.sleep(1000l); } } classAnsyTaskimplementsRunnable{ @Override publicvoidrun(){ Threadthread=newThread("subThread"); System.out.println(thread.getName()+"isdaemon:"+thread.isDaemon()); } }
以上所述是小编给大家介绍的Java守护线程与用户线程详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!