java 守护线程程和普通线程的区别

博客分类:
1,setDaemon(true)后就是后台线程(守护线程 ),反之就是前台线程(用户线程)
2,后台线程 和 前台线程的区别:在java程序中如果所以的前台线程都已经退出,所有的后台线程自动退出。
TestThread为后台线程:
public class ThreadDemo {
public static void main(String[] args) {
Thread t = new TestThread();
t.setDaemon(true);
t.start();
while(true) {
System.out.println("main(): "+Thread.currentThread().getName() + " is running");
class TestThread extends Thread {
public void run() {
while(true) {
System.out.println("TestThread: "+Thread.currentThread().getName() + " is running");
运行当前台线程main退出后自动退出。
TestThread和main一样也是前台线程:
public class ThreadDemo {
public static void main(String[] args) {
Thread t = new TestThread();
t.setDaemon(true);
t.start();
while(true) {
System.out.println("main(): "+Thread.currentThread().getName() + " is running");
class TestThread extends Thread {
public void run() {
while(true) {
System.out.println("TestThread: "+Thread.currentThread().getName() + " is running");
TestThread 就不会退出。
也就是说,所有的前台线程结束后,所有的后台线程会自动退出。
浏览: 364765 次
来自: 北京
路过素人派http://surenpi.com
1楼用法正解
使用 new SortTask().fork()
以前碰到过,估计是在icu包中实现了双击自动选中一段文本的功能 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'&什么是守护线程,什么是非守护线程&
有两种Thread:“守护线程Daemon”(守护线程)与“用户线程User”(非守护线程)。
用户线程:非守护线程包括常规的用户线程或诸如用于处理GUI事件的事件调度线程,虚拟机在它所有非守护线程已经离开后自动离开。
守护线程:守护线程则是用来服务用户线程的,比如说GC线程。如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。(里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,所以它可以在它自己的虚拟的平台里面构造出对 自己有利的机制,而语言或者说平台的设计者多多少少是受到Unix思想的影响,而守护线程机制又是对JVM这样的平台凑合,于是守护线程应运而生);
守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。
守护线程与用户线程的唯一区别是:其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开,当JVM中所有的线程都是守护线程的时候,JVM就可以退出了(如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了);如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)。
举个例子:就像天上人间的保安&(守护线程),里面有牌位姑娘(非守护线程),他们是可以同时干着各自的活儿,但是 姑娘们要是都被JC带走了,那么门口的保安也就没有存在的意义了。
&怎样创建守护线程&
&&&&&& 守护线程与普通线程写法上基本没什么区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。&& &&& 1、thread.setDaemon(true)必须在thread.start()之前设置,你不能把正在运行的常规线程设置为守护线程,否则会跑出一个IllegalThreadStateException异常,如果线程是守护线程,则isDaemon方法返回true。(备注:这点与守护进程有着明显的区别,守护进程是创建后,让进程摆脱原会话的控制+让进程摆脱原进程组的控制+让进程摆脱原控制终端的控制;所以说寄托于虚拟机的语言机制跟系统级语言有着本质上面的区别)。&&&&&& 2、在Daemon线程中产生的新线程也是Daemon的。&&(这一点又是有着本质的区别了:守护进程fork()出来的子进程不再是守护进程,尽管它把父进程的进程相关信息复制过去了,但是子进程的进程的父进程不是init进程,所谓的守护进程本质上说就是“父进程挂掉,init收养,然后文件0,1,2都是/dev/null,当前目录到/”)&&&&&&& 3、不是所有的应用都可以分配给Daemon线程来进行服务,比如读写操作或者计算逻辑。因为在Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。&
setDaemon方法的详细说明:
&守护线程调度示例&
//示例1:完成文件输出的守护线程任务
import java.io.*;
public class TestDemo {
public static void main(String[] args) throws InterruptedException
Runnable tr = new TestRunnable();
Thread thread = new Thread(tr);
thread.setDaemon(true); //设置守护线程
thread.start(); //开始执行分进程
class TestRunnable implements Runnable{
public void run(){
Thread.sleep(1000);//守护线程阻塞1秒后运行
File f=new File("daemon.txt");
FileOutputStream os=new FileOutputStream(f,true);
os.write("daemon".getBytes());
catch(IOException e1){
e1.printStackTrace();
catch(InterruptedException e2){
e2.printStackTrace();
运行结果:文件daemon.txt中没有"daemon"字符串。但是如果把thread.setDaemon(true); //设置守护线程注释掉,文件daemon.txt是可以被写入daemon字符串的
JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台线程候一定要注意这个问题。
//示例2:线程的调度-守护线程&
class Test {
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 {
void run() {
for ( int i = 0; i & 5; i++) {
System.out.println( "线程1第" + i +
"次执行!");
Thread.sleep(7);
catch (InterruptedException e) {
e.printStackTrace();
class MyDaemon
implements Runnable {
void run() {
for ( long i = 0; i & 9999999L; i++) {
System.out.println( "后台线程第" + i +
"次执行!");
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
**********************************/
从上面的执行结果可以看出:
前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了(当前线程全是守护线程时,JVM将退出)。
---------------------------------------------------------------------------------------
注:本文转载于:http://blog.csdn.net/wjh/article/details/,感谢原文作者。
阅读(...) 评论()最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)&,(PS:以前忽略了)。
&&&&&& 估计学过Unix开发但是没有细致学习Java的同学们会疑惑了,操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,所以它可以在它自己的虚拟的平台里面构造出对自己有利的机制,而语言或者说平台的设计者多多少少是收到Unix思想的影响,而守护线程机制又是对JVM这样的平台凑合,于是守护线程应运而生。
&&&&&& Daemon的作用是为其他线程的运行提供服务,比如说GC线程。其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了。
&&&&&& 守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:public final void setDaemon(boolean on)&;但是有几点需要注意:
1)、thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。&&(备注:这点与守护进程有着明显的区别,守护进程是创建后,让进程摆脱原会话的控制+让进程摆脱原进程组的控制+让进程摆脱原控制终端的控制;所以说寄托于虚拟机的语言机制跟系统级语言有着本质上面的区别)
2)、&在Daemon线程中产生的新线程也是Daemon的。&&(这一点又是有着本质的区别了:守护进程fork()出来的子进程不再是守护进程,尽管它把父进程的进程相关信息复制过去了,但是子进程的进程的父进程不是init进程,所谓的守护进程本质上说就是&父进程挂掉,init收养,然后文件0,1,2都是/dev/null,当前目录到/&)
3)、不是所有的应用都可以分配给Daemon线程来进行服务,比如读写操作或者计算逻辑。因为在Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。
//完成文件输出的守护线程任务
import java.io.*;&&
class TestRunnable implements Runnable{&&
&&& public void run(){&&
&&&&&&&&&&&&&& try{&&
&& &&&&&&&&&&&&&&&Thread.sleep(1000);//守护线程阻塞1秒后运行&&
&&&&&&&&&&&&&&&&& File f=new File("daemon.txt");&&
&&&&&&&&&&&&&&&&& FileOutputStream os=new FileOutputStream(f,true);&&
&&&&&&&&&&&&&&&&& os.write("daemon".getBytes());&&
&&&&&&&&&& }&&
&&&&&&&&&&&&& &catch(IOException e1){&&
&&&&&&&&& e1.printStackTrace();&&
&&&&&&&&&&&&&& }&&
&&&&&&&&&&&&&& catch(InterruptedException e2){&&
&&&&&&&&&&&&&&&&& e2.printStackTrace();&&
&&&&&&&&&& }&&
public class TestDemo2{&&
&&& public static void main(String[] args) throws InterruptedException&&
&&&&&&& Runnable tr=new TestRunnable();&&
&&&&&&& Thread thread=new Thread(tr);&&
&&&&&&&&&&&&&&& thread.setDaemon(true); //设置守护线程&&
&&&&&&& thread.start(); //开始执行分进程&&
运行结果:文件daemon.txt中没有"daemon"字符串。
但是如果把thread.setDaemon(true); //设置守护线程注释掉,文件daemon.txt是可以被写入daemon字符串的
  JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台线程候一定要注意这个问题。&
但是daemon Thread实际应用在那里呢?举个例子,web服务器中的Servlet,容器启动时后台初始化一个服务线程,即调度线程,负责处理http请求,然后每个请求过来调度线程从线程池中取出一个工作者线程来处理该请求,从而实现并发控制的目的。
网上摘的一个图,方便大家理解:
阅读(...) 评论()拒绝访问 | www.ggdoc.com | 百度云加速
请打开cookies.
此网站 (www.ggdoc.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3e45cfcdda6743ad-ua98).
重新安装浏览器,或使用别的浏览器博客分类:
文章出处:
守护线程(Daemon)
Java有两种Thread:“守护线程Daemon”与“用户线程User”。
我们之前看到的例子都是用户,守护线程是一种“在后台提供通用性支持”的线程,它并不属于程序本体。
从字面上我们很容易将守护线程理解成是由虚拟机(virtual machine)在内部创建的,而用户线程则是自己所创建的。事实并不是这样,任何线程都可以是“守护线程Daemon”或“用户线程User”。他们在几乎每个方面都是相同的,唯一的区别是判断虚拟机何时离开:
用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。
守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。
setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,false为User模式。setDaemon(boolean on)方法必须在线程启动之前调用,当线程正在运行时调用会产生异常。isDaemon方法将测试该线程是否为守护线程。值得一提的是,当你在一个守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程同样。import java.io.IOE
package cn.com.
* 守护线程 说明:守护线程在没有用户线程可服务时自动离开
* 此程序在启动后,守护线程一直在运行,当用户从键盘输入字符并按回车后,main线程结束,守护线程自动结束
* 守护线程一般是为其他线程提供服务的,当其他线程结束时,守护线程没有服务的对象了,所以也就自动结束了生命周期
* @author zhq
public class DaemonThread extends Thread {
public DaemonThread() {
* 线程的run方法,它将和其他线程同时运行
public void run() {
while (true) {
for (int i = 1; i &= 100; i++) {
this.setSleep(200);
System.out.println(i);
this.setSleep(2000);
public void setSleep(long time) {
Thread.sleep(time);
} catch (InterruptedException ex) {
ex.printStackTrace();
package cn.com.
import java.io.IOE
public class DarmonApp {
public static void main(String[] args) {
DaemonThread daemonThread = new DaemonThread();
// 设置为守护线程
daemonThread.setDaemon(true);
daemonThread.start();
System.out.println("isDaemon = " + daemonThread.isDaemon());
System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束
} catch (IOException ex) {
ex.printStackTrace();
例:我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。
浏览: 346802 次
来自: 郑州
* Flips this buff ...
感谢,清晰了很多。
jdluojing 写道你的说法也不完整,buffer中的f ...
关于这段话,我有不同看法:2)如果instance变量是一个对 ...
如果没有前台页面 只是作为服务端提供HTTP接口的话 可不可以 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 守护线程和非守护线程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信