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字符串的。