sleep和wait都可以讓線程睡眠
不同:
sleep需要指定時(shí)間,而wait可以指定時(shí)間,也可以不用指定時(shí)間。
sleep時(shí)間到了線程就會重新恢復(fù)到運(yùn)行狀態(tài)。wait如果沒有指定時(shí)間,必須通過notify、notifyAll方法來喚醒
sleep可以使用同步代碼塊中,也可以不使用同步代碼塊中,wait必須使用同步代碼塊中。
sleep睡眠后不會釋放鎖,而wait會釋放鎖。
一般情況下線程要結(jié)束,都是通過run方法運(yùn)行完成,線程就結(jié)束了。如果要線程提前中止運(yùn)行,可以使用stop方法。但是stop方法過時(shí)了,原因有不安全因素。stop方法中給出了相應(yīng)的解決方案:在線程中可以定義一些變量或者標(biāo)記,然后在線程運(yùn)行的期間,判斷這個(gè)變量或者標(biāo)記,最終讓線程執(zhí)行的仍然運(yùn)行完成。如果線程長時(shí)間處于等待(凍結(jié))狀態(tài)可以使用interrupt方法來中斷這種等待。
interrupt() 其實(shí)是把線程這種等待狀態(tài)給清除,讓線程重新恢復(fù)到運(yùn)行狀態(tài)。
1 //測試線程停止和中斷等待 2 3 class Demo implements Runnable 4 { 5 boolean flag = false; 6 public void run() 7 { 8 while( true ) 9 {10 synchronized( this )11 {12 System.out.flag);13 14 try{ this.wait(); }catch(Exception e){}15 16 if(flag)17 {18 break;19 }20 }21 }22 23 }24 }25 class ThreadDemo 26 {27 public static void main(String[] args) 28 {29 Demo d = new Demo();30 31 Thread t = new Thread(d);32 Thread t2 = new Thread(d);33 34 t.start();35 t2.start();36 37 38 for( int i=0;i<100;i++ )39 {40 System.out.println(Thread.currentThread().getName()+"========"+i);41 if( i==50 )42 {43 d.flag = true;44 //清除Thread-0的等待狀態(tài)45 t.interrupt();46 t2.interrupt();47 }48 }49 }50 }
守護(hù)線程:后臺線程。當(dāng)我們直接創(chuàng)建的線程,沒有設(shè)置它的任何屬性時(shí),這個(gè)線程一般都屬于非守護(hù)線程(前臺線程)。
非守護(hù)線程,它和主線程一起執(zhí)行,當(dāng)主線程執(zhí)行完成之后,如果還有其他非守護(hù)線程沒有執(zhí)行結(jié)束,當(dāng)前程序依然在正常的運(yùn)行。
守護(hù)線程:它也是用來執(zhí)行線程任務(wù)的,它會隨著非守護(hù)線程一起執(zhí)行。當(dāng)程序中沒有任何一個(gè)非守護(hù)線程在運(yùn)行時(shí),這時(shí)不管有多少個(gè)守護(hù)線程,它們及時(shí)沒有執(zhí)行完成,程序也會自動停止運(yùn)行。守護(hù)線程就自動結(jié)束運(yùn)行了。
線程組:把完成類似功能的線程可以合并在一起,使用一個(gè)組來管理當(dāng)前這些線程,即可以通過組的方式來管理線程。
線程優(yōu)先級:線程優(yōu)先級采用數(shù)字來標(biāo)識,從1開始到10,一般情況下會使用1 5 10 來標(biāo)記當(dāng)前的線程的優(yōu)先級
優(yōu)先級高的線程執(zhí)行的次數(shù)會比優(yōu)先級低的線程多。優(yōu)先級高,只能讓cpu執(zhí)行到這個(gè)線程的幾率變高,而不是說cpu就一直在執(zhí)行它。
getPriority() 獲取當(dāng)前線程的優(yōu)先級
setPriority(int newPriority) 設(shè)置線程的優(yōu)先級,newPriority參數(shù)可以是1-10!建議設(shè)置的時(shí)候1 5 10 這三個(gè)數(shù)字。
守護(hù)線程源碼:
1 //測試線程停止和中斷等待 2 3 class Demo implements Runnable 4 { 5 boolean flag = false; 6 public void run() 7 { 8 int num = 1; 9 while( num<20 )10 {11 System.out.println(Thread.currentThread().getName()+"......"+num++);12 }13 }14 }15 class ThreadDemo2 16 {17 public static void main(String[] args) throws InterruptedException18 {19 Demo d = new Demo();20 21 Thread t = new Thread(d);22 Thread t2 = new Thread(d);23 t.setPriority(10);24 t2.setPriority(1); 25 26 //把2個(gè)線程都設(shè)置成守護(hù)線程27 t.setDaemon(true);28 t2.setDaemon(true);29 t.start();30 t2.start();31 32 for( int i=0;i<10;i++ )33 {34 System.out.println(Thread.currentThread().getName()+"========"+i);35 //讓主線程臨時(shí)停頓36 Thread.yield();37 }38 39 System.out.println("........................."+t);40 }41 }
join() 讓某個(gè)線程強(qiáng)制加入到當(dāng)前cpu的執(zhí)行隊(duì)列中。在使用join加入其他線程到運(yùn)行狀態(tài)中來時(shí),這個(gè)加入的語句肯定是寫在其他的線程的執(zhí)行代碼中。書寫加入線程的代碼所在的那個(gè)線程此時(shí)就會處理臨時(shí)凍結(jié)狀態(tài),等待被加入的線程執(zhí)行結(jié)束后,它就立刻恢復(fù)運(yùn)行的狀態(tài)。
yield() 讓當(dāng)前正在執(zhí)行的臨時(shí)停頓一下,然后立刻就恢復(fù)運(yùn)行狀態(tài)。
多線程需要掌握的技術(shù):
1、創(chuàng)建線程的2種方式 繼承Thread和實(shí)現(xiàn)Runnable接口
2、掌握線程的安全問題發(fā)生的原因和解決
3、掌握單生產(chǎn)和單消費(fèi)的原理以及等待喚醒機(jī)制


新聞熱點(diǎn)
疑難解答
圖片精選