在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
用户线程就是在进程运行中生成或者创建的线程, 用户系统进程的运作。
守护线程:守护线程是专门管理用户线程而创建的,当用户线程全部都结束时,所有的守护线程也就结束了。如果有一个用户线程仍然在运行状态,那么所有的守护线程都不能结束,必须服务完最后一个用户线程结束释放后才会自动结束。
守护线程生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。
守护线程的创建:
守护线程必须在start()方法前设置 如:
Runnable r = new DaemonThreadTest();
Thread thread = new Thread(r);
//设置为守护线程(Daemon Thread)
thread.setDaemon(true);
否则会报
java.lang.IllegalThreadStateException
守护线程应用: 最大的应用就是GC (垃圾回收处理机制) 因为守护线程是JVM后端运行的线程,需要注意的是GC对用户线程对象(GC面向的是对象)进行管理,但是线程(级别:GC ROOT 与GC同级别)的运行释放跟GC是没有关系的,线程运行完后通过finalize释放。
守护线程在所有用户结束后都会立马停止,不管是否正在运行
代码:
import java.io.*;
public class DaemonThreadTest implements Runnable {
@Override
public void run() {
InputStream in = null;
OutputStream out = null;
try {
//睡眠1s 线程在睡眠期间不会释放内存资源
Thread.sleep(1000);
in = new FileInputStream(new File("E:/VPN.bat"));
out = new FileOutputStream(new File("D:/copy2.bat"));
byte[] a = new byte[100];
while (in.read(a) != -1) {
out.write(a);
System.out.print("the bytes has been written"+a);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Runnable r = new DaemonThreadTest();
Thread thread = new Thread(r);
//设置为守护线程(Daemon Thread)
thread.setDaemon(true);
thread.start();
}
}
console 结果:
第一行表明已经创建线程 但是又出现disconnected
说明在守护线程sleep 期间 所用用户线程已经运行完毕,所以守护线程立马停止而造成读写失败
总结:
感觉守护线程就是用户线程的一个监督者,他不能直接的对用户线程进行操作,但是在开发过程中,他可以提示我们各个线程运行状况,能让我们对用户线程进行更好的管理。