- 什么是守護線程,什么是非守護線程?
- java有兩種狀態的線程
- 守護線程與非守護線程的區別
- 守護線程與非守護線程代碼演示區別
- 創建守護線程
- 守護線程:主線程銷毀停止,守護線程一起銷毀
- 非守護線程:如果主線程銷毀,用戶線程繼續運行且互不影響。
什么是守護線程,什么是非守護線程?
java有兩種狀態的線程
- 守護線程(例如垃圾回收線程:gc線程)
- 非守護線程(用戶線程:用戶線程即我們手動創建的線程)
守護線程與非守護線程的區別
1.守護線程
- 有一個特征,例如當主線程運行的時候,垃圾回收線程一起運行。
- 當主線程銷毀,會和主線程一起銷毀。
2.非守護線程
- 如果主線程銷毀,用戶線程繼續運行且互不影響。
守護線程與非守護線程代碼演示區別
創建守護線程
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("我是子線程(用戶線程)");
}
}
});
// 標識當前方法為守護線程,一定要在啟動線程前設置為守護線程
t1.setDaemon(true);
t1.start();
必須在t1.start()
之前設置,你不能把正在運行的常規線程設置為守護線程,否則報IllegalThreadStateException
異常
守護線程:主線程銷毀停止,守護線程一起銷毀
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("我是子線程(用戶線程)");
}
}
});
// 標識當前方法為守護線程,一定要在啟動線程前設置為守護線程
t1.setDaemon(true);
//啟動線程
t1.start();
//相當與主線程
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(300);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("main:i:" + i);
}
System.out.println("主線程執行完畢...");
}
以下為運行結果:
main:i:0
main:i:1
main:i:2
我是子線程(用戶線程)
main:i:3
main:i:4
main:i:5
我是子線程(用戶線程)
main:i:6
main:i:7
main:i:8
我是子線程(用戶線程)
main:i:9
主線程執行完畢...
主線程結束之后並沒有在繼續運行守護線程,守護線程也跟着結束,一起銷毀停止。
非守護線程:如果主線程銷毀,用戶線程繼續運行且互不影響。
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("我是子線程(用戶線程)");
}
}
});
//啟動線程
t1.start();
//相當與主線程
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(300);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("main:i:" + i);
}
System.out.println("主線程執行完畢...");
}
以下為運行結果:
main:i:0
main:i:1
main:i:2
我是子線程(用戶線程)
main:i:3
main:i:4
main:i:5
我是子線程(用戶線程)
main:i:6
main:i:7
main:i:8
我是子線程(用戶線程)
main:i:9
主線程執行完畢...
我是子線程(用戶線程)
我是子線程(用戶線程)
我是子線程(用戶線程)
我是子線程(用戶線程)
我是子線程(用戶線程)
我是子線程(用戶線程)
。。。。。。。。。。。。。。。。。。。。。
當主線程銷毀停止,非守護線程(用戶線程)並沒有結束,而是一直在執行,與主線程互不影響。
來源:blog.csdn.net/yang2812098/article/details/87651721