您的位置:首页 > 其它

守护线程和非守护线程

2015-12-06 16:30 302 查看
1.java线程分为两类,守护线程和非守护线程

2.守护线程是指程序运行的时候在后台提供一种通用服务的线程。比如GC线程就是一个很称职的守护线程,这种线程并不是程序中不可或缺的部分。因此,但所有非守护线程结束时,程序也就结束了,同时会杀死进程中所有的守护线程。反过来说任何非守护线程还在运行,程序就不会终止。

3.用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

4.将线程转化为守护线程:调用Thread对象的setDaemon(true)方法来实现.但是需要注意一下几点:

~Thread.setDaemon(true);必须在Thread.start()之前设置,否则会抛出一个IllegalThreadStateException异常,你不能在线程运行时把线程设置为守护线程。

~在Daemon线程中产生的新线程也是Daemon的。

~守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。

package com.sxt.thread;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

/**

* @author jt

*2015-12-6 下午4:09:28

*

*/

public class TestRunnable implements Runnable{

/* (non-Javadoc)

* @see java.lang.Runnable#run()

*/

@Override

public void run() {

try {

Thread.sleep(1000);//守护线程阻塞一秒执行

File f=new File("E://deamon.txt");//创建文件

FileOutputStream os=new FileOutputStream(f);//创建文价输出流

os.write("deamon".getBytes());//程序向文件中输出数据(写入数据到文件)

} catch (InterruptedException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

package com.sxt.thread;

/**

* @author jt

*2015-12-6 下午4:19:39

*

*/

public class TestDemon {

/**

* @param args

*/

public static void main(String[] args) {

Runnable rb=new TestRunnable();

Thread th=new Thread(rb);

th.setDaemon(true);//设置为守护线程

th.start();

}

}

运行结果:文件daemon.txt中没有"daemon"字符串。

如果把 th.setDaemon(true);//设置为守护线程这段代码注释掉,文件daemon.txt是可以被写入daemon字符串的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: