java守护线程和非守护线程
来源:互联网 发布:如何卸载软件管家 编辑:程序博客网 时间:2024/05/21 11:00
Java 线程分为两类:用户线程(User Thread)和守护线程(Daemon Thread)
守护线程的作用是为其他线程提供服务,譬如垃圾回收器(GC),只要当前 JVM 实例中还有非守护线程运行,则守护线程就会一直工作下去,直至所有非守护线程结束,守护线程随 JVM 一起结束。
除 JVM 内部的守护线程外,用户可以通过以下方法设置守护线程:
public final void setDaemon(boolean on)
- 1
- 1
可以通过以下方法查询线程是否为守护线程:
public final boolean isDaemon()
- 1
- 1
关于守护线程的几个要点:
1 setDaemon
方法必须在 thread.start()
之前设置,否则会抛出 java.lang.IllegalThreadStateException
异常,不能将正在运行的常规线程设置为守护线程
public static void main(String[] args) { Thread thread = new Thread(); thread.start(); thread.setDaemon(true);}
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
运行结果:
2 在 Daemon 线程中产生的新线程也是 Daemon 的
class CustomThread extends Thread { @Override public void run() { Thread thread = new Thread(); System.out.println("Sub Thread : " + thread.isDaemon()); }}public static void main(String[] args) { Thread thread = new CustomThread(); System.out.println("Thread : " + thread.isDaemon()); thread.setDaemon(true); System.out.println("Thread : " + thread.isDaemon()); thread.start();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
运行结果:
3 不是所有的应用都可以分配给 Daemon 线程来进行服务,比如读写操作或者计算逻辑,因为在 Daemon 线程还没来的及进行操作时虚拟机可能已经退出了
class CustomThread extends Thread { @Override public void run() { FileOutputStream outputStream = null; try { Thread.sleep(3000); File file = new File("daemon.txt"); outputStream = new FileOutputStream(file); outputStream.write("daemon".getBytes()); } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }}public static void main(String[] args) { Thread thread = new CustomThread(); thread.setDaemon(true); thread.start();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
以上代码中线程功能是向工程根目录的“daemon.txt”文件写入字符串“daemon”,实际运行结果发现并未成功写入,且未报任何错误,原因是写入文件的线程被设置为守护线程,该线程还在sleep
过程中时所有用户线程就全部结束了,守护线程也会随着 JVM 一起退出。
示例2:
class CustomThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("Daemon Thread : " + i); } }}public static void main(String[] args) { Thread daemonThread = new CustomThread(); daemonThread.setDaemon(true); Thread userThread = new Thread(); daemonThread.start(); userThread.start();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
运行结果:
从运行结果可以看出,守护线程并未执行完成所有循环就结束了,因为用户线程在守护线程执行循环的过程中就已全部结束,守护线程也随着 JVM 一起结束
0 0
- java守护线程和非守护线程
- java守护线程和非守护线程
- java 多线程守护线程和非守护线程
- Java 守护线程和非守护线程的说明
- Java的守护线程和非守护线程
- Java 多线程:守护线程和非守护线程
- java的守护线程和非守护线程详解
- Java守护线程与非守护线程
- java-守护线程与非守护线程
- JAVA守护线程 非守护线程
- 关于守护线程和非守护线程
- 守护线程和非守护线程
- JVM守护线程和非守护线程
- JVM守护线程和非守护线程
- 守护线程和非守护线程
- java守护线程和守护线程
- Java中的守护线程 & 非守护线程(简介)
- java的守护线程与非守护线程
- leecode 解题总结:374. Guess Number Higher or Lower
- android框架Xutils
- stack,deque,queue对比
- CSS3 媒介查询
- Python彻底解决采集网页乱码问题
- java守护线程和非守护线程
- 机器学习(周志华)习题解答-决策树(4.1-4.10)
- 【HDU 1597】find the nth digit(模拟)
- 【计算机视觉】人脸识别总结
- 蓝绿部署、A/B测试以及灰度发布
- VB利用PictureBox控件播放GIF动画
- unity官方教程Space shooter学习笔记-01
- 自己写GoBinarySearchTree 二叉查找树
- struct kobject