Java線程優(yōu)先級(jí)和守護(hù)線程原理解析
一、線程優(yōu)先級(jí)的介紹
java 中的線程優(yōu)先級(jí)的范圍是1~10,默認(rèn)的優(yōu)先級(jí)是5?!案邇?yōu)先級(jí)線程”會(huì)優(yōu)先于“低優(yōu)先級(jí)線程”執(zhí)行。
java 中有兩種線程:用戶線程和守護(hù)線程??梢酝ㄟ^(guò)isDaemon()方法來(lái)區(qū)別它們:如果返回false,則說(shuō)明該線程是“用戶線程”;否則就是“守護(hù)線程”。用戶線程一般用于執(zhí)行用戶級(jí)任務(wù),而守護(hù)線程也就是“后臺(tái)線程”,一般用來(lái)執(zhí)行后臺(tái)任務(wù)。需要注意的是:Java虛擬機(jī)在“用戶線程”都結(jié)束后會(huì)后退出。
JDK 中關(guān)于線程優(yōu)先級(jí)和守護(hù)線程的介紹如下:
每個(gè)線程都有一個(gè)優(yōu)先級(jí)?!案邇?yōu)先級(jí)線程”會(huì)優(yōu)先于“低優(yōu)先級(jí)線程”執(zhí)行。每個(gè)線程都可以被標(biāo)記為一個(gè)守護(hù)進(jìn)程或非守護(hù)進(jìn)程。在一些運(yùn)行的主線程中創(chuàng)建新的子線程時(shí),子線程的優(yōu)先級(jí)被設(shè)置為等于“創(chuàng)建它的主線程的優(yōu)先級(jí)”,當(dāng)且僅當(dāng)“創(chuàng)建它的主線程是守護(hù)線程”時(shí)“子線程才會(huì)是守護(hù)線程”。
當(dāng)Java虛擬機(jī)啟動(dòng)時(shí),通常有一個(gè)單一的非守護(hù)線程(該線程通過(guò)是通過(guò)main()方法啟動(dòng))。JVM會(huì)一直運(yùn)行直到下面的任意一個(gè)條件發(fā)生,JVM就會(huì)終止運(yùn)行:
(01) 調(diào)用了exit()方法,并且exit()有權(quán)限被正常執(zhí)行。
(02) 所有的“非守護(hù)線程”都死了(即JVM中僅僅只有“守護(hù)線程”)。
每一個(gè)線程都被標(biāo)記為“守護(hù)線程”或“用戶線程”。當(dāng)只有守護(hù)線程運(yùn)行時(shí),JVM會(huì)自動(dòng)退出。
二、線程優(yōu)先級(jí)的示例
我們先看看優(yōu)先級(jí)的示例 :
package com.demo.threadPriority;
public class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
public void run(){
for (int i=0; i<5; i++) {
System.out.println(Thread.currentThread().getName()
+"("+Thread.currentThread().getPriority()+ ")"
+", loop "+i);
}
}
}
package com.demo.threadPriority;
public class Demo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()
+"("+Thread.currentThread().getPriority()+ ")");
Thread t1=new MyThread("t1"); // 新建t1
Thread t2=new MyThread("t2"); // 新建t2
t1.setPriority(1); // 設(shè)置t1的優(yōu)先級(jí)為1
t2.setPriority(10); // 設(shè)置t2的優(yōu)先級(jí)為10
t1.start(); // 啟動(dòng)t1
t2.start(); // 啟動(dòng)t2
}
}
運(yùn)行結(jié)果:
main(5) t1(1), loop 0 t1(1), loop 1 t2(10), loop 0 t1(1), loop 2 t2(10), loop 1 t1(1), loop 3 t2(10), loop 2 t1(1), loop 4 t2(10), loop 3 t2(10), loop 4
結(jié)果說(shuō)明:
(01) 主線程main的優(yōu)先級(jí)是5。
(02) t1的優(yōu)先級(jí)被設(shè)為1,而t2的優(yōu)先級(jí)被設(shè)為10。cpu在執(zhí)行t1和t2的時(shí)候,根據(jù)時(shí)間片輪循調(diào)度,所以能夠并發(fā)執(zhí)行。
三、守護(hù)線程的示例
下面是守護(hù)線程的示例。
package com.demo.daemonThread;
public class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
public void run(){
try {
for (int i=0; i<5; i++) {
Thread.sleep(3);
System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
}
} catch (InterruptedException e) {
}
}
}
package com.demo.daemonThread;
public class MyDaemon extends Thread{
public MyDaemon(String name) {
super(name);
}
public void run(){
try {
for (int i=0; i<10000; i++) {
Thread.sleep(1);
System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i);
}
} catch (InterruptedException e) {
}
}
}
package com.demo.daemonThread;
public class Demo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()
+"(isDaemon="+Thread.currentThread().isDaemon()+ ")");
Thread t1=new MyThread("t1"); // 新建t1
Thread t2=new MyDaemon("t2"); // 新建t2
t2.setDaemon(true); // 設(shè)置t2為守護(hù)線程
t1.start(); // 啟動(dòng)t1
t2.start(); // 啟動(dòng)t2
}
}
運(yùn)行結(jié)果:
main(isDaemon=false) t2(isDaemon=true), loop 0 t2(isDaemon=true), loop 1 t1(isDaemon=false), loop 0 t2(isDaemon=true), loop 2 t1(isDaemon=false), loop 1 t2(isDaemon=true), loop 3 t2(isDaemon=true), loop 4 t1(isDaemon=false), loop 2 t2(isDaemon=true), loop 5 t2(isDaemon=true), loop 6 t1(isDaemon=false), loop 3 t2(isDaemon=true), loop 7 t2(isDaemon=true), loop 8 t2(isDaemon=true), loop 9 t1(isDaemon=false), loop 4
結(jié)果說(shuō)明:
(01) 主線程main是用戶線程,它創(chuàng)建的子線程t1也是用戶線程。
(02) t2是守護(hù)線程。在“主線程main”和“子線程t1”(它們都是用戶線程)執(zhí)行完畢,只剩t2這個(gè)守護(hù)線程的時(shí)候,JVM自動(dòng)退出。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java利用Phantomjs實(shí)現(xiàn)生成圖片的功能
這篇文章主要介紹了Java利用Phantomjs實(shí)現(xiàn)生成圖片的功能,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08
SpringSecurity中的表單認(rèn)證詳細(xì)解析
這篇文章主要介紹了SpringSecurity中的表單認(rèn)證詳細(xì)解析,在上一篇文章中,我們初步引入了?Spring?Security,并使用其默認(rèn)生效的?HTTP?基本認(rèn)證保護(hù)?URL?資源,在本篇文章中我們使用表單認(rèn)證來(lái)保護(hù)?URL?資源,需要的朋友可以參考下2023-12-12
Spring Security Oauth2.0認(rèn)證授權(quán)教程
Spring Security實(shí)現(xiàn)用戶認(rèn)證、會(huì)話管理及授權(quán),支持Token等多方式,OAuth2.0用于分布式系統(tǒng)統(tǒng)一認(rèn)證,網(wǎng)關(guān)解析令牌并轉(zhuǎn)發(fā)請(qǐng)求2025-07-07
SpringBoot+Mybatis實(shí)現(xiàn)Mapper接口與Sql綁定幾種姿勢(shì)
通常我們?cè)谑褂肕ybatis進(jìn)行開(kāi)發(fā)時(shí),會(huì)選擇xml文件來(lái)寫(xiě)對(duì)應(yīng)的sql,然后將Mapper接口與sql的xml文件建立綁定關(guān)系,然后在項(xiàng)目中調(diào)用mapper接口就可以執(zhí)行對(duì)應(yīng)的sql,感興趣的可以學(xué)習(xí)一下2021-09-09
IDEA導(dǎo)入下載的項(xiàng)目后左側(cè)沒(méi)有樹(shù)狀層級(jí)目錄的解決方案
這篇文章主要介紹了IDEA導(dǎo)入下載的項(xiàng)目后左側(cè)沒(méi)有樹(shù)狀層級(jí)目錄的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-08-08
Java 添加數(shù)字簽名到excel及檢測(cè),刪除簽名
這篇文章主要介紹了Java 添加數(shù)字簽名到excel及檢測(cè),刪除簽名的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-04-04
關(guān)于maven項(xiàng)目中使用BCrypt加密方式
BCrypt是一種基于Blowfish加密算法的密碼散列函數(shù),用于安全存儲(chǔ)和驗(yàn)證用戶密碼,它通過(guò)引入鹽和工作因子增加計(jì)算復(fù)雜度,有效防止彩虹表攻擊和破解,BCrypt具備適應(yīng)性工作因子、成本參數(shù)調(diào)整、迭代哈希和密鑰擴(kuò)展等特點(diǎn),被廣泛應(yīng)用于Web應(yīng)用程序的安全性設(shè)計(jì)中2024-10-10

