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ù)線程。可以通過isDaemon()方法來區(qū)別它們:如果返回false,則說明該線程是“用戶線程”;否則就是“守護(hù)線程”。用戶線程一般用于執(zhí)行用戶級(jí)任務(wù),而守護(hù)線程也就是“后臺(tá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ù)線程(該線程通過是通過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é)果說明:
(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é)果說明:
(01) 主線程main是用戶線程,它創(chuàng)建的子線程t1也是用戶線程。
(02) t2是守護(hù)線程。在“主線程main”和“子線程t1”(它們都是用戶線程)執(zhí)行完畢,只剩t2這個(gè)守護(hù)線程的時(shí)候,JVM自動(dòng)退出。
原文鏈接:cnblogs.com/xiaoxi/p/7133002.html
