2017 12 04 多執行緒

2021-08-11 19:42:31 字數 2858 閱讀 5301

一.多執行緒

多執行緒目的:更好地利用cpu的資源。

1.基本概念

(1)多執行緒:乙個程式(程序)執行時產生了不知乙個執行緒。

(2)並行與併發

並行:多個cpu例項或者多台機器同時執行一段處理邏輯,時真正的同時。

併發:通過cpu排程演算法,讓使用者看上去同時執行,實際從cpu操作層面並不是同時執行。

(3)執行緒安全:經常用來描繪一段**。指在併發的情況下,該**經過多執行緒使用,執行緒的排程順序不影響任何結果。這個時候使用多執行緒,我們只需要關注系統的記憶體,cpu是不是夠用即可。反過來,執行緒不安全就意味著執行緒的排程順序會影響最終結果。

(4)同步:通過人為的控制和排程,保證共享資源的多執行緒訪問成為執行緒安全,來保證結果準確。

執行緒安全的優先順序高於效能。

2.執行緒的狀態

執行緒在running的過程中可能會遇到阻塞(blocked)情況

(1)呼叫join()和sleep()方法,sleep()時間結束或被打斷,join()中斷,io完成都會回到runnable狀態,等待jvm的排程。

(2)呼叫wait(),使該執行緒處於等待池(wait blocked pool),直到notify()/notifyall(),執行緒被喚醒被放到鎖定池(lock blocked pool ),釋放同步鎖使執行緒回到可執行狀態(runnable)

(3)對running狀態的執行緒加同步鎖(synchronized)使其進入(lock blocked pool ),同步鎖被釋放進入可執行狀態(runnable)。

此外,在runnable狀態的執行緒是處於被排程的執行緒,此時的排程順序是不一定的。thread類中的yield方法可以讓乙個running狀態的執行緒轉入runnable。

3.每個物件都有的方法

monitor:每個物件都有乙個監視器。

synchronized、wait、notify針對同乙個監視器。意味著wait之後,其他執行緒可以進入同步塊執行。

synchronized:

(1)對於併發工作,需要某種方式來防止兩個任務訪問相同的資源(其實就是共享資源競爭)。 防止這種衝突的方法 就是當資源被乙個任務使用時,在其上加鎖。第乙個訪問某項資源的任務必須鎖定這項資源,使其他任務在其被解鎖之前,就無法訪問它了,而在其被解鎖之時,另乙個任務就可以鎖定並使用它了。

(2)如果你正在寫乙個變數,它可能接下來將被另乙個執行緒讀取,或者正在讀取乙個上一次已經被另乙個執行緒寫過的變數,那麼你必須使用同步,並且,讀寫執行緒都必須用相同的監視器鎖同步。

注意:每個訪問臨界共享資源的方法都必須被同步,否則它們不會正確工作。

(3)synchronized 關鍵字,它包括兩種用法:synchronized 方法和 synchronized 塊。

volatile

4.基本執行緒類

(1)

public class mythread extends thread

}(2)

public class mythread implements runnable

}thread thread = new mythread();

thread.start();

中斷:中斷是乙個狀態,需要去檢測。

5.高階多執行緒控制類

2.重要方法

execute() 向執行緒池提交乙個任務,交由執行緒池執行。

submit() 同上,但可以返回任務執行結果。

shutdown() 關閉執行緒池

shutdownnow() 關閉執行緒池

3.任務提交後的處理策略

①如果當前執行緒池中的執行緒數目小於corepoolsize,則每來乙個任務,就會建立乙個執行緒去執行這個任務;

②如果當前執行緒池中的執行緒數目》=corepoolsize,則每來乙個任務,會嘗試將其新增到任務快取佇列當中,若新增成功,則該任務會等待空閒執行緒將其取出去執行;若新增失敗(一般來說是任務快取佇列已滿),則會嘗試建立新的執行緒去執行這個任務;

③如果當前執行緒池中的執行緒數目達到maximumpoolsize,則會採取任務拒絕策略進行處理;

④如果執行緒池中的執行緒數量大於 corepoolsize時,如果某執行緒空閒時間超過keepalivetime,執行緒將被終止,直至執行緒池中的執行緒數目不大於corepoolsize;如果允許為核心池中的執行緒設定存活時間,那麼核心池中的執行緒空閒時間超過keepalivetime,執行緒也會被終止。

4.任務拒絕策略

條件:任務快取佇列滿 && 執行緒數大於maximumpoolsize

常用四種:

threadpoolexecutor.abortpolicy:丟棄任務並丟擲rejectedexecutionexception異常。

threadpoolexecutor.discardpolicy:也是丟棄任務,但是不丟擲異常。

threadpoolexecutor.discardoldestpolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)

threadpoolexecutor.callerrunspolicy:由呼叫執行緒處理該任務

5.執行緒池關閉:

①shutdown():不會立即終止執行緒池,而是要等所有任務快取佇列中的任務都執行完後才終止,但再也不會接受新的任務。

②shutdownnow():立即終止執行緒池,並嘗試打斷正在執行的任務,並且清空任務快取佇列,返回尚未執行的任務。

6.使用示例

7.配置執行緒池大小

如果是cpu密集型任務(計算),就需要盡量壓榨cpu,參考值可以設為 ncpu+1

如果是io密集型任務(檔案讀寫),參考值可以設定為2*ncpu

**參考

多執行緒 多執行緒原理

我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...

多執行緒(一) tomcat 多執行緒

web server允許的最大執行緒連線數還受制於作業系統的核心引數設定,通常windows是2000個左右,linux是1000個左右。1.編輯tomcat安裝目錄下的conf目錄下的server.xml檔案 maxthreads 150 表示最多同時處理150個連線,tomcat使用執行緒來處理...

多執行緒 理解多執行緒(一)

程序 程序是cpu分配資源的基本單位 執行緒 執行緒是cpu排程的基本單位 資源分配給程序,所有執行緒共享該程序的資源 當執行緒數大於cpu的數量,會出現時間片的輪詢。cpu時間片是直接分配給執行緒的,執行緒拿到cpu時間片就能執行了 cpu時間片不是先分給程序然後再由程序分給程序下的執行緒的。所有...