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