- 浏览: 149295 次
- 性别:
- 来自: 北京
文章分类
最新评论
JVM会等待所有非守护线程退出以后才会退出!
public static void main(String[] args) {
new MyThread().start();
//如果MyThread不是守护线程,那么JVM必须等待MyThread退出了才会退出
//并不是退出main函数就已经表示JVM可以结束!
}
----------------------------------------
比如你正在 用 Java 写成的编辑器 写 Word 文档,
你一边敲键盘,这是个 非守护线程, 后台还有一个 拼写检查 线程,它是个守护线程,他尽量不打扰你写稿子, 你们可以同时进行,他发现有拼写错误时在状态条显示错误,但是你可以忽略。
就像 城堡门前有个卫兵 (守护线程),里面有诸侯(非守护线程),他们是可以同时干着各自的活儿,但是 城堡里面的人都搬走了, 那么卫兵也就没有存在的意义了。
-----------------
守护线程与普通线程的唯一区别是:当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)
所以setDeamon(true)的唯一意义就是告诉JVM不需要等待它退出,让JVM喜欢什么退出就退出吧,不用管它。
无论是什么线程,都一定会分时间片执行的,和上面的检测拼写及输入并没有任何关系
-------------------
守护线程的唯一用途就是告诉JVM不需要等待它退出,当JVM中所有的线程都是守护线程的时候就可以正常的退出了
普通线程不一样,JVM必须等待它的退出才可以正常的退出。
-----
我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开
-------------------
http://lavasoft.blog.51cto.com/62575/221845
/**
* Java线程:线程的调度-守护线程
*
* @author leizhimin 2009-11-4 9:02:40
*/
public class Test {
public static void main(String[] args) {
Thread t1 = new MyCommon();
Thread t2 = new Thread(new MyDaemon());
t2.setDaemon(true); //设置为守护线程
t2.start();
t1.start();
}
}
class MyCommon extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("线程1第" + i + "次执行!");
try {
Thread.sleep(7);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyDaemon implements Runnable {
public void run() {
for (long i = 0; i < 9999999L; i++) {
System.out.println("后台线程第" + i + "次执行!");
try {
Thread.sleep(7);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
后台线程第0次执行!
线程1第0次执行!
线程1第1次执行!
后台线程第1次执行!
后台线程第2次执行!
线程1第2次执行!
线程1第3次执行!
后台线程第3次执行!
线程1第4次执行!
后台线程第4次执行!
后台线程第5次执行!
后台线程第6次执行!
后台线程第7次执行!
Process finished with exit code 0
从上面的执行结果可以看出:
前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了。
实际上:JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台县城时候一定要注意这个问题。
public static void main(String[] args) {
new MyThread().start();
//如果MyThread不是守护线程,那么JVM必须等待MyThread退出了才会退出
//并不是退出main函数就已经表示JVM可以结束!
}
----------------------------------------
比如你正在 用 Java 写成的编辑器 写 Word 文档,
你一边敲键盘,这是个 非守护线程, 后台还有一个 拼写检查 线程,它是个守护线程,他尽量不打扰你写稿子, 你们可以同时进行,他发现有拼写错误时在状态条显示错误,但是你可以忽略。
就像 城堡门前有个卫兵 (守护线程),里面有诸侯(非守护线程),他们是可以同时干着各自的活儿,但是 城堡里面的人都搬走了, 那么卫兵也就没有存在的意义了。
-----------------
守护线程与普通线程的唯一区别是:当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)
所以setDeamon(true)的唯一意义就是告诉JVM不需要等待它退出,让JVM喜欢什么退出就退出吧,不用管它。
无论是什么线程,都一定会分时间片执行的,和上面的检测拼写及输入并没有任何关系
-------------------
守护线程的唯一用途就是告诉JVM不需要等待它退出,当JVM中所有的线程都是守护线程的时候就可以正常的退出了
普通线程不一样,JVM必须等待它的退出才可以正常的退出。
-----
我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开
-------------------
http://lavasoft.blog.51cto.com/62575/221845
/**
* Java线程:线程的调度-守护线程
*
* @author leizhimin 2009-11-4 9:02:40
*/
public class Test {
public static void main(String[] args) {
Thread t1 = new MyCommon();
Thread t2 = new Thread(new MyDaemon());
t2.setDaemon(true); //设置为守护线程
t2.start();
t1.start();
}
}
class MyCommon extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("线程1第" + i + "次执行!");
try {
Thread.sleep(7);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyDaemon implements Runnable {
public void run() {
for (long i = 0; i < 9999999L; i++) {
System.out.println("后台线程第" + i + "次执行!");
try {
Thread.sleep(7);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
后台线程第0次执行!
线程1第0次执行!
线程1第1次执行!
后台线程第1次执行!
后台线程第2次执行!
线程1第2次执行!
线程1第3次执行!
后台线程第3次执行!
线程1第4次执行!
后台线程第4次执行!
后台线程第5次执行!
后台线程第6次执行!
后台线程第7次执行!
Process finished with exit code 0
从上面的执行结果可以看出:
前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了。
实际上:JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台县城时候一定要注意这个问题。
发表评论
-
java -jar classpath心
2015-09-18 14:52 373http://sddhn.blog.163.com/blog/ ... -
split
2013-11-07 14:27 640split("\\+") -
cookie 和session 的区别
2013-04-01 14:18 668session是服务器端缓存 ... -
java SimpleDateFormat在多线程下问题
2013-02-26 17:43 1016https://github.com/dreamhead/u ... -
java 静态内部类
2012-11-30 17:57 717public class Outer { static int ... -
Class.forName和ClassLoader.loadClass的区别
2012-11-05 15:39 595Class的装载分了三个阶段,loading,linking和 ... -
MD5带盐值的java加密算法
2012-09-11 11:01 9129我们知道,如果直接 ... -
java里synchronized用法
2012-08-21 17:31 801http://blog.163.com/ray_jun/blo ... -
Java中的移位操作以及基本数据类型转换成字节数组【收集】
2012-03-09 10:43 1116http://blog.csdn.net/vozon/arti ... -
java移位操作
2012-02-28 16:03 4065---- http://jinguo.iteye.com/bl ... -
java 基本类型的相互转换
2012-02-28 14:06 3727int z=257; byte x=(byte)z; ... -
java并发
2011-06-30 10:12 646http://www.blogjava.net/xylz/ar ... -
struts2-标签中时间比较的方法
2011-04-19 12:33 984<s:iterator value="resu ... -
正则表达式
2011-04-12 16:24 670http://deerchao.net/tutorials/r ... -
struts2 s:iterator
2011-03-21 12:09 755<s:iterator value="user ...
相关推荐
5. **守护线程(Daemon)**:守护线程是一种不会阻止程序退出的特殊线程,例如JVM的垃圾收集器就是守护线程。通过`setDaemon(true)`方法将线程设置为守护线程。 6. **线程池**:Java提供`ExecutorService`和`...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有...同时,理解并熟练掌握多线程编程能帮助开发者解决复杂的问题,提高软件的质量和用户体验。
"Java守护线程与用户线程详解" Java中的线程可以分为守护线程(DaemonThread)和用户线程(UserThread)两类。守护线程和用户线程的唯一...了解Java中的守护线程和用户线程,可以帮助开发者更好地开发高效、可靠的程序。
2. 守护线程与用户线程:守护线程不阻碍JVM退出,而用户线程则会阻止JVM退出。 八、中断与异常处理 1. Thread.interrupt():用于中断线程,但不一定立即停止,需要在run()方法内部检查中断标志并作出相应处理。 2. ...
守护线程(Daemon)是一种不阻止程序退出的线程,如垃圾收集器就是守护线程。当所有非守护线程结束时,程序会终止,即使还有守护线程在运行。 掌握Java的多线程机制对于编写高效、并发友好的应用程序至关重要,它...
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...
java daemon 程序,有助于理解守护线程的概念和使用
Java线程有10个优先级,从`MIN_PRIORITY`(1)到`MAX_PRIORITY`(10),默认是`NORM_PRIORITY`(5)。优先级高的线程更可能被调度执行,但不保证。 4. **线程同步** 当多个线程访问共享资源时,可能会出现竞态条件,...
总结来说,"java两个线程互相守护"涉及到了Java线程的同步和通信机制,通过`wait()`、`notify()`方法以及共享监视器对象,可以实现线程间的有序交互。这种机制在多线程编程中广泛使用,以确保线程安全和程序的正确性...
浅谈java中守护线程与用户线程 本篇文章主要介绍了java中守护线程与用户线程的概念和区别。...本篇文章主要介绍了java中守护线程与用户线程的概念和区别,并通过例子来加深对守护线程和用户线程的理解。
Java中的`Thread.setDaemon(true)`方法可将线程设置为守护线程。通常,后台服务或日志记录线程可以设置为守护线程。 7. **线程同步与并发控制** Java提供了多种同步机制,如`synchronized`关键字、`java.util....
Java 中有两类线程:User Thread(用户线程)和 Daemon Thread(守护线程)。用户线程即运行在前台的线程,而守护线程是运行在后台的线程。守护线程的作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护...
2.守护线程(Daemon Thread):后台运行的线程,当所有非守护线程结束时,守护线程也会自动结束。 六、线程池 Java提供ExecutorService和ThreadPoolExecutor来管理线程,可以避免频繁创建和销毁线程带来的开销,...
守护线程(Daemon Thread)是一种特殊线程,当所有非守护线程结束时,守护线程也会随之结束,通常用于后台服务。 总结: Java多线程编程是提升程序性能和响应性的关键技术。理解多线程的概念,掌握线程的创建、同步...
Java多线程中的线程守护(Daemon)是一个关键概念,主要涉及到线程的生命周期和Java虚拟机(JVM)的退出条件。守护线程与普通线程的主要区别在于,当JVM中没有非守护线程(用户线程)在运行时,JVM会自动退出,即使...
守护线程在所有非守护线程结束时自动终止,通常用于后台服务,如垃圾收集器。 通过以上知识点,我们可以更好地理解和运用Java多线程,实现高效、稳定的并发程序。文档“java多线程实例.docx”可能包含具体的示例...
Java线程有五种状态:新建、可运行、运行、阻塞和终止。理解这些状态有助于我们更好地控制和调试多线程程序。 四、线程同步 线程同步是防止多个线程同时访问共享资源导致数据不一致的重要机制。Java提供了多种同步...
在 Java 中,有两种类型的线程:前台线程(用户线程)和后台线程(守护线程)。前台线程是用户创建的线程,而后台线程是 JVM 创建的线程。后台线程具有特殊的性质,当所有的前台线程退出时,后台线程自动退出。 ```...
- 线程可分为用户线程和守护线程两种类型。用户线程执行完毕后,JVM会自动关闭;守护线程则不独立于JVM,通常由操作系统或用户自行创建。 #### 二、Java线程:创建与启动 1. **定义线程** - **扩展 `java.lang....
4. **守护线程**:一种特殊的线程类型,用于在后台执行任务,如垃圾回收等。 #### 九、Java线程:线程的同步-同步方法与同步块 同步方法和同步块是实现线程安全的基本手段。同步方法简单易用,而同步块则更加灵活...