守护线程和非守护线程

来源:互联网 发布:网站源码制作手机软件 编辑:程序博客网 时间:2024/06/05 08:49

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

 

0 0
原创粉丝点击