每個(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ù)線程”。
每一個(gè)線程都被標(biāo)記為“守護(hù)線程”或“用戶線程”。當(dāng)只有守護(hù)線程運(yùn)行時(shí),JVM會(huì)自動(dòng)退出。
public class Thread1001{
static class Thread1002 extends Thread{
public Thread1002(String name){
super(name);
}
@Override
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){
}
}
}
static class Thread1003 extends Thread{
public Thread1003(String name){
super(name);
}
@Override
public void run() {
try{
for(int i=0;i<1000;i++){
Thread.sleep(1);
System.out.println(this.getName() + " isDaemon(): " + this.isDaemon() + " loop: " + i);
}
} catch (InterruptedException e){
}
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + " isDaemon: " + Thread.currentThread().isDaemon());
Thread t1 = new Thread1002("t1");
Thread t2 = new Thread1003("t2");
t2.setDaemon(true);
t1.start();
t2.start();
}
}
運(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
t2 isDaemon(): true loop: 3
t1 isDaemon(): false loop: 1
t2 isDaemon(): true loop: 4
t2 isDaemon(): true loop: 5
t1 isDaemon(): false loop: 2
t2 isDaemon(): true loop: 6
t1 isDaemon(): false loop: 3
t2 isDaemon(): true loop: 7
t2 isDaemon(): true loop: 8
t1 isDaemon(): false loop: 4
t2 isDaemon(): true loop: 9
運(yùn)行結(jié)果:
- 主線程main是用戶線程,它創(chuàng)建的子線程t1也是用戶線程。
- t2是守護(hù)線程。在“主線程main”和“子線程t1”(它們都是用戶線程)執(zhí)行完畢,只剩t2這個(gè)守護(hù)線程的時(shí)候,JVM自動(dòng)退出。