|
大型互聯(lián)網(wǎng)項(xiàng)目視頻 本公眾專注于為廣大Java初學(xué)者和愛(ài)好者以及熱愛(ài)編程的菜鳥(niǎo)提供學(xué)習(xí)交流平臺(tái),共同成長(zhǎng)。 如果您發(fā)現(xiàn)什么錯(cuò)誤、遺漏或不明的地方,可以通過(guò)文章下留言、群內(nèi)討論或私撩小編提出意見(jiàn)反饋,當(dāng)然小編會(huì)給這些奉獻(xiàn)的朋友分享Java 大型互聯(lián)網(wǎng)項(xiàng)目實(shí)戰(zhàn)視頻資料(不定期更新視頻資料) ,希望與大家一同成長(zhǎng)!?。?/span> 線程可以劃分優(yōu)先級(jí),優(yōu)先級(jí)分為1-10的10個(gè)等級(jí),數(shù)字越大優(yōu)先級(jí)越高,優(yōu)先級(jí)較高的線程得到CPU資源較多,也就是CPU優(yōu)先執(zhí)行優(yōu)先級(jí)較高的線程對(duì)象中的任務(wù)(其實(shí)并不是這樣)。但是線程的優(yōu)先級(jí)仍然無(wú)法保障線程的執(zhí)行次序。只不過(guò),優(yōu)先級(jí)高的線程獲取CPU資源的概率較大,優(yōu)先級(jí)低的并非沒(méi)機(jī)會(huì)執(zhí)行。 線程是有繼承關(guān)系的,比如當(dāng)A線程中啟動(dòng)B線程,那么B和A的優(yōu)先級(jí)將是一樣的。 /** * 線程優(yōu)先級(jí) */ public class TheadTest4 { public static void main(String[] args) { Thread thread = new Thread(new A()); thread.start(); } }
class A implements Runnable {
@Override public void run() { System.out.println('A的優(yōu)先級(jí)為:' + Thread.currentThread().getPriority()); Thread thread = new Thread(new B()); thread.start(); } }
class B implements Runnable {
@Override public void run() { System.out.println('B的優(yōu)先級(jí)為:' + Thread.currentThread().getPriority()); } }
三、setPriority設(shè)置優(yōu)先級(jí) 更改線程的優(yōu)先級(jí)。當(dāng)使用了setPriority設(shè)置了優(yōu)先級(jí),但是線程的優(yōu)先級(jí)仍然無(wú)法保障線程的執(zhí)行次序。只不過(guò),優(yōu)先級(jí)高的線程獲取CPU資源的概率較大,優(yōu)先級(jí)低的并非沒(méi)機(jī)會(huì)執(zhí)行。
/** * 線程優(yōu)先級(jí) */ public class TheadTest4 { public static void main(String[] args) { Thread thread1 = new Thread(new A()); Thread thread2 = new Thread(new B()); //將優(yōu)先級(jí)設(shè)置到最低 thread1.setPriority(10); //將優(yōu)先級(jí)設(shè)置到最高 thread2.setPriority(1); //線程啟動(dòng) thread1.start(); thread2.start(); } }
class A implements Runnable { @Override public void run() { for (int i = 0; i 10 ; i++) { System.out.println('A的優(yōu)先級(jí)為:' + Thread.currentThread().getPriority()); } } }
class B implements Runnable { @Override public void run() { for (int i = 0; i 10 ; i++) { System.out.println('B的優(yōu)先級(jí)為:' + Thread.currentThread().getPriority()); } } }
結(jié)果執(zhí)行了好幾次才出現(xiàn)的結(jié)果: A的優(yōu)先級(jí)為:10 B的優(yōu)先級(jí)為:1 A的優(yōu)先級(jí)為:10 B的優(yōu)先級(jí)為:1 A的優(yōu)先級(jí)為:10 B的優(yōu)先級(jí)為:1 A的優(yōu)先級(jí)為:10 A的優(yōu)先級(jí)為:10 A的優(yōu)先級(jí)為:10 A的優(yōu)先級(jí)為:10 A的優(yōu)先級(jí)為:10 A的優(yōu)先級(jí)為:10 B的優(yōu)先級(jí)為:1 A的優(yōu)先級(jí)為:10 B的優(yōu)先級(jí)為:1 B的優(yōu)先級(jí)為:1 B的優(yōu)先級(jí)為:1 B的優(yōu)先級(jí)為:1 B的優(yōu)先級(jí)為:1 B的優(yōu)先級(jí)為:1
這就表示優(yōu)先級(jí)低的線程不是非得優(yōu)先級(jí)高的線程執(zhí)行完畢之后才執(zhí)行的,這也可以說(shuō)明線程就是隨機(jī)性的! 守護(hù)線程是一種特殊的線程,它屬于是一種陪伴線程。簡(jiǎn)單點(diǎn)說(shuō) 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ì)退出,所以守護(hù)線程也會(huì)隨之結(jié)束。注意:主線程main是用戶線程。 做一個(gè)小例子吧?。。?/p>public class TheadTest4 { public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(new A()); //設(shè)置名稱為A thread1.setName('A...'); //設(shè)置為守護(hù)線程 thread1.setDaemon(true); thread1.start();
Thread thread2 = new Thread(new A()); //設(shè)置名稱為B thread2.setName('B...'); thread2.start(); Thread.sleep(3000); //直接中斷非守護(hù)線程 thread2.interrupt(); Thread.sleep(10000); System.out.println('程序結(jié)束!!!'); } }
class A implements Runnable { private int i; @Override public void run() { try { while (true) { i++; System.out.println('線程名稱:'+Thread.currentThread().getName()+',i=' + i + ',是否為守護(hù)線程:' + Thread.currentThread().isDaemon()); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println('線程名稱:'+Thread.currentThread().getName()+'中斷線程了'); } } }
結(jié)果: 線程名稱:A...,i=1,是否為守護(hù)線程:true 線程名稱:B...,i=1,是否為守護(hù)線程:false 線程名稱:A...,i=2,是否為守護(hù)線程:true 線程名稱:B...,i=2,是否為守護(hù)線程:false 線程名稱:B...,i=3,是否為守護(hù)線程:false 線程名稱:A...,i=3,是否為守護(hù)線程:true 線程名稱:B...中斷線程了 線程名稱:A...,i=4,是否為守護(hù)線程:true 線程名稱:A...,i=5,是否為守護(hù)線程:true 線程名稱:A...,i=6,是否為守護(hù)線程:true 線程名稱:A...,i=7,是否為守護(hù)線程:true 線程名稱:A...,i=8,是否為守護(hù)線程:true 線程名稱:A...,i=9,是否為守護(hù)線程:true 線程名稱:A...,i=10,是否為守護(hù)線程:true 線程名稱:A...,i=11,是否為守護(hù)線程:true 線程名稱:A...,i=12,是否為守護(hù)線程:true 線程名稱:A...,i=13,是否為守護(hù)線程:true 程序結(jié)束!!!
從上面的代碼可以看出來(lái),B是用戶線程當(dāng)它中斷了之后守護(hù)線程還沒(méi)有結(jié)束,是因?yàn)橹骶€程(用戶線程)還沒(méi)有結(jié)束,所以說(shuō)明是所有的用戶線程結(jié)束之后守護(hù)線程才會(huì)結(jié)束。 從以上的例子大家應(yīng)該還不知道守護(hù)線程到底有什么用處?。。∷袁F(xiàn)在為大家布置一個(gè)真實(shí)場(chǎng)景的習(xí)題。 需求:創(chuàng)建一個(gè)用戶線程是向一個(gè)目錄里面存儲(chǔ)文件,再啟動(dòng)一個(gè)守護(hù)線程定時(shí)刪除這個(gè)目錄里面創(chuàng)建時(shí)間五秒前或者1分鐘前創(chuàng)建的文件。 該需求大家如果不會(huì)可以到初學(xué)者交流群里討論
|