執行緒排程 執行緒池

2021-08-19 18:17:03 字數 2341 閱讀 9653

1.每次new thread新建物件,效能查。

2.執行緒缺乏統一管理,可能無限制的新建執行緒,相互競爭,有可能占用過多系統資源導致司機或oom(

out of memory)。

3.缺少更多的功能,如更多執行、定期執行、執行緒中斷。

1.重用存在的執行緒,減少物件建立、消亡的開銷,效能好。

2.可有效控制最大併發執行緒數,提高系統資源利用率,同時可以避免過多資源競爭,避免阻塞。

3.提供定時執行、定期執行、單執行緒、併發數控制等高階功能。

1.threadpoolexecutor

threadpoolexecutor中含有三個引數

1)corepoolsize:核心執行緒數量。

2)maximumpoolsize:最大執行緒數。

3)workqueue:阻塞佇列,儲存等待執行的任務,很重要,會對執行緒池執行過程產生重大影響。synchronousqueuelinkedblockingdequearrayblockingqueue

4)keepalivetime:非核心執行緒沒有任務執行時最多保持多長時間終止。

5)unit:keepalivetime的時間單位。

6)threadfactory:執行緒工廠,用來建立執行緒。

7)rejecthandler:拒絕處理任務時的策略。

8)執行緒池規則

下面都假設任務佇列沒有大小限制:

a.如果執行緒數量<=核心執行緒數量,那麼直接啟動乙個核心執行緒來執行任務,不會放入佇列中。           

b.如果執行緒數量》核心執行緒數,但<=最大執行緒數,並且任務佇列是linkedblockingdeque的時候,超過核心執行緒數量的任務會放在任務佇列中排隊。

c.如果執行緒數量》核心執行緒數,但<=最大執行緒數,並且任務佇列是synchronousqueue的時候,執行緒池會建立新執行緒執行任務,這些任務也不會被放在任務佇列中。這些執行緒屬於非核心執行緒,在任務完成後,閒置時間達到了超時時間就會被清除。        

d.如果執行緒數量》核心執行緒數,並且》最大執行緒數,當任務佇列是linkedblockingdeque,會將超過核心執行緒的任務放在任務佇列中排隊。也就是當任務佇列是linkedblockingdeque並且沒有大小限制時,執行緒池的最大執行緒數設定是無效的,他的執行緒數最多不會超過核心執行緒數。

e.如果執行緒數量》核心執行緒數,並且》最大執行緒數,當任務佇列是synchronousqueue的時候,會因為執行緒池拒絕新增任務而丟擲異常。

任務佇列大小有限時

a.當linkedblockingdeque塞滿時,新增的任務會直接建立新執行緒來執行,當建立的執行緒數量超過最大執行緒數量時會拋異常。

b.synchronousqueue沒有數量限制。因為他根本不保持這些任務,而是直接交給執行緒池去執行。當任務數量超過最大執行緒數時會直接拋異常。

9)執行緒池的使用:

a.execute():提交任務,交給執行緒池執行。

b.submit():提交任務,能夠返回結果(execute+future)。

c.shutdown():關閉執行緒池,等待任務都執行完畢。

d.shutdownnow():關閉執行緒池,不等待任務執行完畢,會中斷正在執行的執行緒。

e.gettaskcount():執行緒池已執行和未執行的任務總數。

f.getcompletedtaskcount():已完成的任務數量。

g.getpoolsize():執行緒池當前的執行緒數量。

h.getactivecount():當前執行緒池中正在執行任務的執行緒數量。

2.executor框架提供的四種執行緒池

executor框架提供了四種執行緒池,其內部都是返回乙個threadpoolexecutor物件。

1)executors.newcachedthreadpool:

建立乙個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活**空閒執行緒,若無可**,則新建執行緒。(執行緒最大併發數不可控制)

2) executors.newfixedthreadpool:建立乙個定長線程池,可控制線程最大併發數,超出的執行緒會在佇列中等待。

3) executors.newscheduledthreadpool:建立乙個定長線程池,支援定時及週期性任務執行。

4) executors.newsinglethreadpool:建立乙個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(fifo, lifo, 優先順序)執行。

3.執行緒池的合理配置

1)cpu密集型任務,就需要盡量壓榨cpu,參考值可以盡量設定為cpu數量+1。

2)io密集型任務,參考值可以設定為2*cpu數量。

注:使用執行緒池也需要慎重,有些場景下因為執行緒池中任務排程所造成的開銷,可能會使我們得不償失。

10 執行緒池 執行緒排程

執行緒池 第四種 獲取執行緒的方法 執行緒池 乙個executorservice,它使用執行緒池的可能的某個執行緒之一執行每個提交的任務,通常使用 executors 工廠方法配置 executorservice service executors.newfixedthreadpool 5 執行緒池...

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...