Java线程区别
JAVA线程分为即实线程与守护线程,守护线程是优先级低,存活与否不影响JVM的退出的线程,实现守护线程的方法是在线程start()之前setDaemon(true),否则会抛出一个IllegalThreadStateException异常。不能操作文件、数据库等资源,避免主线程关闭而未能关闭守护线程的资源,并且它会在任何时候甚至在一个操作的中间发生中断。
作者:梦里藍天
来源:CSDN
原文:线程详解
守护线程了解
- daemon线程所产生的所有线程都是daemon的
- 只有虚拟机中的用户线程(非Daimon线程)全部结束,Daemon线程就会立即结束,并且也不会调用finally里的语句。
- 在主线程关闭后无需手动关闭守护线程,因为会自动关闭
- java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开,用于实时监控和管理系统中的可回收资源。
- 守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
- 它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”,依赖于jvm中的用户进程是否运行。
部分引用资料:南望孤笑
使用案例
package thread;
/**
* @author pengchuang
* @date 2021/9/27 10:39
*/
public class Daemon {
static class MainThread extends Thread {
@Override
public void run() {
System.out.println("MainThread is daemon? " + this.isDaemon());
System.out.println("MainThread begin!");
Thread sub1 = new SubThread();
// 开启守护进程的开关
//sub1.setDaemon(true);
sub1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("MainThread" + " finally");
}
System.out.println("MainThread end!");
}
}
static class SubThread extends Thread {
public void run() {
System.out.println("SubThread is daemon? " + this.isDaemon());
System.out.println("SubThread begin!");
int i = 0;
try {
while (i < 10) {
System.out.println("SubThread " + i++);
Thread.sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("SubThread finally");
}
System.out.println("SubThread end!");
}
}
public static void main(String[] args) {
System.out.println("Main begin");
Thread mainThread = new MainThread();
mainThread.start();
try {
mainThread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main end!");
}
}
当我们开始setDaemon(false)时候,可以得到结果
Main begin
MainThread is daemon? false
MainThread begin!
SubThread is daemon? false
SubThread begin!
SubThread 0
SubThread 1
SubThread 2
SubThread 3
SubThread 4
Main end!
MainThread finally
MainThread end!
SubThread 5
SubThread 6
SubThread 7
SubThread 8
SubThread 9
SubThread finally
SubThread end!
当我们开始setDaemon(true)时候,可以得到结果
Main begin
MainThread is daemon? false
MainThread begin!
SubThread is daemon? true
SubThread begin!
SubThread 0
SubThread 1
SubThread 2
SubThread 3
SubThread 4
Main end!
MainThread finally
MainThread end!
我们可以得到对于守护进程而言,当用户进程运行完毕,也就是一般进程运行完毕时候,jvm关闭时,守护进程会立马中断关闭,同理,当jvm中所有进程都是守护进程时候,jvm就会退出。