1. 程式人生 > >多執行緒程式設計之執行緒基礎

多執行緒程式設計之執行緒基礎

前言

此內容是閱讀了書籍《JAVA多執行緒程式設計核心技術》後作為學習總結的文章,同時也梳理一下內容。建議大家有興趣都可以閱讀一下這本書,對於想了解更多的同學來說是一個很好的教材,同時建議大家多去思考和動手編寫程式碼,融會貫通之後再去看一遍,會有更多的體會。就比如《JVM底層實現最佳實戰》的書籍一樣,我讀了已經不下五遍了,但每次讀都能有新的收穫一樣。希望對大家有幫助。

該篇文章是用於瞭解多執行緒的一些基本概念、JDK支援多執行緒程式設計的類和方法,介面等。

1.1 程序與執行緒概念

什麼是程序:
程序是作業系統結構的基礎,是一次程式的執行,是程式及其資料結構在處理機上順序執行時所發生的活動;
是程式在資料集合上執行的過程,它是系統進行資源分配和排程的獨立單位。比如說:作業系統中執行的exe就是一個程序。其實程序就是應用。

什麼是執行緒:
執行緒可以理解為程序中獨立執行的子任務。比如QQ.exe執行時,有好友視訊執行緒,檔案下載執行緒,傳輸資料執行緒,傳送表情執行緒等等。

1.2 實現多執行緒程式設計

JDK開發包中,自帶了對多執行緒技術的支援,可以方便進行多執行緒程式設計。
實現多執行緒程式設計有多種方式:繼承Thread類,實現Runnable介面,Callable介面

1.2.1繼承Thread類

在繼承Thread類實現多執行緒程式設計之前,我們先來看看Thread類結構:
優先順序:[1,10]
執行緒狀態:新建、就緒、阻塞、執行、死亡
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}

態切換圖:
多執行緒程式設計之執行緒基礎

1.2.2實現Runnable介面

    @FunctionalInterface
    public interface Runnable {
        public abstract void run();
    }

1.2.3實現Callable介面

    @FunctionalInterface
    public interface Callable<V> {
        V call() throws Exception;
    }

1.2.4Runnable與Callable區別

Runnable不可以丟擲異常,Callable可以;
Runnable不可以返回結果,Callable可以,結合FutureTask可以拿到結果,但會把當前執行緒阻塞。

1.2.5例項變數與執行緒安全

A.不共享資料的情況,不存在這個資料執行緒安全問題。
B.共享資料的情況,會存在資料執行緒安全問題。
這個時候需要給run方法加上synchronized關鍵字,防止執行緒間操作出現資料錯亂。

1.3 currentThread()方法

獲取當前執行緒資訊

1.4 isAlive()方法

判斷當前的執行緒是否出於活動狀態。

1.5 sleep()方法

指定毫秒數執行緒休眠

1.6 getId()方法

獲取執行緒唯一標識。

1.7 停止執行緒

interrupt()方法停止執行緒,僅僅是當前執行緒中打一個停止的標誌,並不是真的停止執行緒。
this.interrupted():測試當前執行緒是否已經中斷。 類方法
this.isInterrupted():測試執行緒是否已經中斷。例項方法

異常可以中斷執行緒。
stop暴力停止,已經作廢,因為可能導致一些清理性工作得不到完成。另外一個是對鎖定的物件進行了解鎖導致資料得不到同步處理出現資料不一致的問題。
interrupt()與return結合使用也能實現停止執行緒。

1.8 暫停執行緒

暫停執行緒意味著此執行緒可以恢復執行。可以使用suspend()方法停止執行緒,resume()方法恢復執行緒執行。
但是suspend和resume方法使用不當,容易造成公共的同步物件獨佔,使得其他執行緒無法訪問公共同步物件,容易導致資料不同步。

1.9 yield方法

yield方法的作用是放棄當前的CPU資源,將讓給其他任務去使用CPU。但放棄的時間不確定,有可能馬上又獲取了CPU的時間片。

1.10 執行緒的優先順序

執行緒具有優先順序具有繼承性。
可以通過setPriority()方法可以設定執行緒優先順序。具有規則性:優先順序高的總是大部分優先執行完,但不代表高優先順序的執行緒全部執行。
具備隨機性:不一定能保障高優先順序每次都優先執行。

1.11 執行緒分類

分為使用者執行緒、守護執行緒。
守護執行緒是一種特殊執行緒,它的執行緒有陪伴的含義,當程序不存在非守護執行緒時,則守護執行緒自動銷燬。
比如守護執行緒最典型的就是GC(垃圾回收器)

總結:
這裡主要提到了是執行緒的基本知識,需要上面有些程式碼我沒有貼出來,主要一個是太簡單,另外一個原因是希望讀者能夠動起手來來自己嘗試寫程式碼檢測。這樣有助於對執行緒知識加深理解。打完手工,最後希望有興趣的同學能夠看看這本書:《JAVA多執行緒程式設計核心技術》、《JAVA併發程式設計》、《JAVA高階程式設計》。如果我上面有什麼錯誤希望讀者能夠留言給我,我會第一時間修改,以防止誤導讀者。