多线程基础-守护线程与非守护线程
程序员文章站
2022-05-05 21:46:05
...
1、线程分类:
守护线程 非守护线程
2、程序线程:
主线程 用户线程 gc线程
**主线程:**一种特殊的非守护线程,但是并不能被设置为守护线程。如果强制设置为守护进行会出现以下Exception
**用户线程:**在主线程中创建的线程。该创建的线程可以被设置为守护线程或者非守护线程
**GC线程:**守护线程
3、主线程与非守护线程
package com.shebao.thread;
/**
* @author: zhaoyihang
* @Date: 2020/9/11 8:49 上午
* @Description: 守护与非守护线程
*/
public class ThreadDemo6 {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i < 10;i++){
try{
Thread.sleep(300);
}catch (Exception e){
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
});
t1.setName("非守护线程");
t1.start();
for(int i = 1;i<=5;i++){
try{
System.out.println(Thread.currentThread().getName()+":"+i);
Thread.sleep(100);
}catch (Exception e){
Thread.currentThread().interrupt();
}
}
System.out.println("主线程执行完毕");
}
}
总结:主线程结束非守护线程仍然可以继续运行。
4、主线程与守护线程
package com.shebao.thread;
/**
* @author: zhaoyihang
* @Date: 2020/9/11 8:49 上午
* @Description: 守护与非守护线程
*/
public class ThreadDemo6 {
public static void main(String[] args) {
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i < 10;i++){
try{
Thread.sleep(300);
}catch (Exception e){
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
});
t2.setName("守护线程");
t2.setDaemon(true);
t2.start();
for(int i = 1;i<=5;i++){
try{
System.out.println(Thread.currentThread().getName()+":"+i);
Thread.sleep(100);
}catch (Exception e){
Thread.currentThread().interrupt();
}
}
System.out.println("主线程执行完毕");
}
}
总结:主线程结束,守护线程也立即结束(稍等,这句话稍微有点漏洞后面在进行解析)
5、主线程、守护线程、非守护线程
package com.shebao.thread;
/**
* @author: zhaoyihang
* @Date: 2020/9/11 8:49 上午
* @Description: 守护与非守护线程
*/
public class ThreadDemo6 {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i < 10;i++){
try{
Thread.sleep(300);
}catch (Exception e){
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
});
t1.setName("非守护线程");
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i < 10;i++){
try{
Thread.sleep(300);
}catch (Exception e){
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
});
t2.setName("守护线程");
t2.setDaemon(true);
t2.start();
for(int i = 1;i<=5;i++){
try{
System.out.println(Thread.currentThread().getName()+":"+i);
Thread.sleep(100);
}catch (Exception e){
Thread.currentThread().interrupt();
}
}
System.out.println("主线程执行完毕");
}
}
从上述可以看出,main线程结束守护线程并没有结束,给上述总结存在相驳。
6、 java虚拟机是如何退出的?
如果虚拟机中剩下的都是守护线程,那么JAVA虚拟机不会管守护线程都会退出。如果线程中还有存活的非守护线程,虚拟机就会等待非守护线程执行结束,在等待的过程中守护线程也可以抢占CPU执行。
推荐阅读
-
对python 多线程中的守护线程与join的用法详解
-
java 多线程守护线程
-
小白学Java核心知识(多线程)知识点十:interrupt停止线程、守护线程
-
Java-----多线程小知识点:join()方法和守护线程
-
iOS多线程基础之RunLoop与GCD、AutoreleasePool解析
-
python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)
-
Java多线程开发(线程状态、优先级、用户线程和守护线程)
-
java多线程基础(实现多线程的方式,获取与修改线程名的方法)
-
用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)
-
python实现守护进程、守护线程、守护非守护并行