執行緒基礎學習一

2021-09-24 14:08:46 字數 1948 閱讀 4183

1.執行緒的五個狀態

建立、就緒、執行、阻塞、終止

2.start之後並不一定是立即執行,代表的是就緒狀態;

3.阻塞狀態: 阻塞狀態是正在執行的執行緒由於某種原因放棄cpu的使用權,進入就緒狀態;

有三種型別:

①執行的執行緒執行wait方法,執行緒被jvm放入等待池中;

②執行的執行緒獲取同步鎖時,該同步鎖被別的執行緒占用,執行緒被jvm放入同步鎖中;

③執行的執行緒執行sleep方法或join方法時,等睡眠時間超時的時候,join()等待執行緒,重新進入就緒狀態;

4.sleep() 執行緒睡眠,在睡眠超時之後進入就緒狀態,並不會釋放鎖;

wait():執行此方法時,當前執行緒暫停執行,直到其他執行緒呼叫此方法的notifyi()喚醒;

join():執行此方法時,當前執行緒暫停,讓執行此方法的執行緒執行完之後,在進入就緒狀態;

yield() :執行此方法時,將讓給優先順序更高或者同級的執行緒;讓當前執行狀態回到可執行狀態;

notify(): 

5.sleep()和yield()的區別

sleep()之後執行緒進入阻塞狀態直到超時,把機會讓給了其他執行緒

而yield()讓步是進入就緒狀態,是把機會給了同等優先順序或者更高優先順序的執行緒,自己也有可能再次被選中。

6.sleep()和wait()的區別

wait,notify和notifyall只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用

在等待時 wait 會釋放鎖,而 sleep 一直持有鎖。wait 通常被用於執行緒間互動,sleep 通常被用於暫停執行;』

7.wait ()、notify()必須在synchronized(obj)一起使用,針對的是已經獲取到鎖的來進行等待操作,從功能上來說,使當前執行緒釋放鎖,同時讓該執行緒處於等待,一直到被喚醒,才能繼續獲取鎖;注意 :執行notify的時候,並不是立刻執行被喚醒,而是當前鎖內程式執行完後,從wait執行緒鎖中隨機找一線程對其解鎖;

執行緒池執行流程:

任務過來之後,檢視核心執行緒是否有空閒的,有則執行。

沒有,則檢視等待佇列是否滿了,如果不滿則插入佇列等待。

滿了,則判斷最大可容執行緒數沒有超過最大值,則開創非核心執行緒執行任務,則handle呼叫實現拒絕策略,

拒絕策略有四種:

不執行丟擲異常,執行緒池已經滿了;

不執行也不丟擲異常;

將訊息佇列中的第乙個替代為當前執行緒;

直接用excute進行執行當前任務;

常見的四種執行緒:

cachethreadpool :  可快取執行緒池,有核心執行緒,也有非核心執行緒(數量為沒有上線),有任務就處理,沒有任務就收回執行緒,適用於耗時少 任務量大的執行緒。 缺點建立執行緒數量多

singthreadpool:只有乙個執行緒,使使用者有順序執行的場景。缺點是:佇列堆積,消耗記憶體

fixedthreadpool:定長線程池,沒有非核心執行緒池,定長的,可控制線程最大併發數,超出的執行緒會在佇列中等待。缺點是:佇列堆積,消耗記憶體

secudlethreadpool: 週期性執行緒池,按照某種特定的計畫週期執行,非核心執行緒無線。缺點建立執行緒數量多

使用執行緒的好處:

節省資源;通過重複利用已經建立好的執行緒,節省了建立執行緒的資源消耗

提高響應速度;當任務來臨時,不必等執行緒建立,可以立即執行。

便於管理:使用執行緒池統一管理執行緒。

execute和submit的區別?

都是用來執行任務,但是submit有返回值

執行緒池都有哪幾種工作佇列

陣列有界佇列:原則是對元素進行排序

鍊錶結構的阻塞佇列:先進先出。

乙個不儲存元素的阻塞佇列。只有移除之後,後面的才可以進入,否則一直處於zuse

乙個具有優先順序的無限阻塞佇列();

執行緒配置:

執行緒基礎學習

一 執行緒與程序的關係 乙個應用程式可以存在多個程序例項,而乙個程序實列內部又可以同時包含多個執行緒.從理論上講,執行緒是程序內的單個執行單元,它是windows作業系統為cpu工作分配的乙個最小單位.執行緒主要由資料結構 堆疊和cpu暫存器組成.每乙個執行緒都可以在它的程序中單獨執行,並 儲存自已...

執行緒基礎 一

當多個執行緒訪問mythread的run方法時.以排隊的方式進行處理 這裡排隊順序時cpu排隊順序 乙個執行緒想要執行sychronized 體修飾的方法裡面的 1.獲得鎖 2.拿不到鎖 這個執行緒會不斷的拿鎖,直到拿到為止 不加鎖列印結果 當前執行緒名稱 t2 當前 count 值 3 當前執行緒...

執行緒基礎學習3

執行緒的狀態 等待和喚醒的機制 在多個執行緒之間通過等待方法和喚醒方法進行通訊,沒有被喚醒的話就一直等待。package threadtest void wait 導致當前執行緒等待,直到另乙個執行緒呼叫該物件的 notify 方法或notifyall 方法。void wait long timeo...