一.多執行緒
多執行緒目的:更好地利用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時間片不是先分給程序然後再由程序分給程序下的執行緒的。所有...