Java線程總結

什麼是進程,什麼是線程?多線程

簡而言之,進程能夠當作正在運行的程序的實例。而線程能夠當作進程裏面的一條執行路徑。併發

每一個進程都有獨立代碼和數據空間(進程上下文),同一個進程中能夠共享程序的內存和數據。因此線程之間切換代價小,進程之間切換代價大。jvm

多進程: 在操做系統中能同時運行多個任務(程序)ide

多線程: 在同一進程有多個併發任務在執行測試

線程的建立有兩種方式。spa

方式一:實現Rannable接口,重寫run方法。這種方法,還須要使用Thread類,來對Runnable子類的實例進行封裝,調用Thead類中的start方法才能啓動。操作系統

方式二:繼承Thread類,重寫run方法,調用start()使該線程處於"可執行/可運行"狀態,等待虛擬機來調度線程

啓動線程時,建立的實例不能直接調用,重寫的run方法,不然不是啓動多線程。而是調用start方法。對象

run方法稱爲線程體方法,線程被CPU調度時,自動執行,同一個線程對象只能調用一次start方法。不管線程是否結束,Runnable接口能夠爲一個線程的多個實例共享數據。繼承

方法:

long getId():返回該線程的標識符。

String getName():返回該線程的名稱。

void interrupt():中斷線程。

boolean isAlive():測試線程是否處於活動狀態。

boolean isDaemon():測試該線程是否爲守護線程。

booleanisInterrupted():測試線程是否已經中斷。

void setDaemon(booleanon):將該線程標記爲守護線程或用戶線程。

voidsetName(String name):改變線程名稱,使之與參數 name 相同。

static voidsleep(long millis):在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操做受到系統計時器和調度程序精度和準確性的影響。

void start():使該線程開始執行;Java 虛擬機調用該線程的 run 方法。

static voidyield():暫停當前正在執行的線程對象,並執行其餘線程。

如下的三個方法定義在Object類中,而不是Thread類中。

final void  notifyAll():將全部的線程喚醒,進入就緒狀態。

final void  notify():喚醒一個線程,使其進入就緒狀態。

final void  wait():使線程等待,阻塞狀態。


中斷線程的兩種方法:

方法一:在線程類中設置一個標誌位,經過在其餘線程(例如主線程)中修改該標誌位的值,來達到中止線程的目的.通常在子線程的run()的循環中須要加上退出條件if(flag){....break;}

方法二:線程對象調用interrupt()方法。

(1)要被中斷的線程阻塞在sleep()/wait()/join(),會引起一個      InterruptedException,須要在catch語句中進行處理;

(2)不是上述狀況下,能夠用Thread.interrupted()來獲取是否中斷的狀態,若是是被中斷了,break出來,再也不執行後續語句;注意:該方法調用後,會清除"中斷標誌",下次再調用時,將獲得false

線程的調度:

      線程睡眠:Thread.sleep(longmillis) throws InterruptedException 方法,使線程轉到阻塞狀態。millis參數設定睡眠的時間,以毫秒爲單位。當睡眠結束後,就轉爲就緒(Runnable)狀態。

線程讓步:Thread.yield() 方法,暫停當前正在執行的線程對象,把執行機會讓給相同或者更高優先級的線程。

線程加入:join() throwsInterruptedException 方法 在當前線程中調用另外一個線程的 join()方法,則當前線程轉入WAITING狀態,直到另外一個線程運行結束,當前線程再由阻塞轉爲就緒狀態。

線程等待:Object 類中的wait() throws InterruptedException 方法,致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 喚醒方法。

線程喚醒:Object 類中的notify()方法,喚醒在此對象監視器上等待的單個線程。若是全部線程都在此對象上等待,則會選擇喚醒其中一個線程。選擇是任意性的。Object類中的notifyAll()方法,喚醒在此對象監視器上等待的全部線程。

線程的狀態轉換:線程共有建立狀態,就緒狀態,運行狀態,阻塞狀態,死亡狀態。

建立狀態,在產生線程的對象,尚未調用start方法以前的狀態。調用start方法後,就進入了就緒狀態,等待jvm的調度。一旦jvm調度了線程,就使線程進入了運行狀態。若是運行着的線程,被暫停,就進入了阻塞狀態。若是線程的run方法執行結束或者線程調用了stop方法,則線程就會死亡。

線程的優先級。最高級爲10,最小爲1,默認爲5。線程的優先級設置,並不必定優先級高的就必定先執行,而是先執行的機率大。因此優先級高的,線程先執行這句話是錯的。

使用setPriority()和getPriority()方法分別用來設置和獲取線程的優先級。

通常狀況下不須要手動設置線程的優先級,而是用默認的優先級就好。

相關文章
相關標籤/搜索