1. 程式人生 > >執行緒池中如何確定執行緒的數目

執行緒池中如何確定執行緒的數目

我用C寫了一個執行緒池,但是在寫的時候沒有考慮執行緒池中執行緒的數目,當初直接隨便設定了一個執行緒的數目。

但是在面試時,將常被問到如何設定執行緒池中執行緒的數目的?

我也在網上了搜了一些資料,今天在這裡就說一下“如何設定執行緒池中執行緒的數目?”

執行緒池中執行緒的數目是跟執行緒池所要處理的任務性質有關的

  1. 任務的性質:CPU密集型任務、IO密集型任務、混合型任務。
  2. 任務的優先順序:高、中、低。
  3. 任務的執行時間:長、中、短。
  4. 任務的依賴性:是否依賴其他系統資源,如資料庫連線等。

性質不同的任務可以交給不同規模的執行緒池執行。

針對不同的任務性質而言:CPU密集型任務應配置儘可能小的執行緒,如配置CPU個數+1的執行緒數,IO密集型任務應配置儘可能多的執行緒,因為IO操作不佔用CPU,不要讓CPU閒下來,應加大執行緒數量,如配置兩倍CPU個數+1,而對於混合型的任務,如果可以拆分,拆分成IO密集型和CPU密集型分別處理,前提是兩者執行的時間是差不多的,如果處理時間相差很大,則沒必要拆分了。

任務對其他系統資源有依賴:如某個任務依賴資料庫的連線返回的結果,這時候等待的時間越長,則CPU空閒的時間越長,那麼執行緒數量應設定得越大,才能更好的利用CPU。 

執行緒等待時間所佔比例越高,這樣的話CPU空閒時間比較多,為了能夠更好的利用CPU,需要較多執行緒。

如果執行緒CPU時間所佔比例越高,說明CPU比較繁忙,此時需要越少執行緒。 

另外,如果執行緒數量過多,執行緒之間的切換也會帶來開銷。

是否使用執行緒池就一定比使用單執行緒高效呢?

答案是否定的,比如Redis就是單執行緒的,但它卻非常高效,基本操作都能達到十萬量級/s。從執行緒這個角度來看,部分原因在於:多執行緒帶來執行緒上下文切換開銷,單執行緒就沒有這種開銷。



相關推薦

執行執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

C# 執行取消執行的三種方式

三種方式都使用CancellationToken,只是使用方式不同,有類似於採用全域性標誌位的方式 第一種 檢測IsCancellationRequested方式 static void AsyncOperation1(CancellationToken t

Java實現終止執行正在執行的定時任務

貼個廣告 樓主的部落格已全部搬遷至自己的部落格,感興趣的小夥伴請移步haifeiWu與他朋友們的部落格專欄 源於開發 最近專案中遇到了一個新的需求,就是實現一個可以動態新增定時任務的功能。說到這裡,有人可能會說簡單啊,使用quartz就好了,簡單粗暴。然而

監控執行執行發生未捕獲異常自動重啟功能

       之前專案要實現一個多執行緒發簡訊的功能,每個執行緒都對應一個kafka消費topic,但是偶爾會由於傳過來的資料或是資料庫的原因發生異常,之前為了專案趕進度都是用的try,catch捕獲的Exception異常直接處理掉了,最近有時間了感覺這樣很low,也很不專

java執行和關閉執行執行

如果執行緒經常喜歡去new的話是不對的,你需要一個池子管理。 newCachedThreadPool 這個一個帶快取的執行緒池,是個可以無限大的執行緒池,新建的執行緒放倒這個池子裡,當執行緒停掉了的時候,下個個執行緒進來,可以複用這個執行緒。 newFixe

執行捕獲執行執行異常

在專案中使用執行緒池時,使用瞭如下方式: ExecutorService dataUploadPool = Executors.newFixedThreadPool(writeThreadNum); dataUploadPool.execute(new

java執行任務執行完成後再次執行

最近做爬蟲用到了執行緒池(我是建立一個固定執行緒數量的執行緒池,然後不斷往裡扔任務) 現在要求網站連結如果爬完後再次啟動任務爬取連結,所以就想到線上程池中任務都執行完成後在重新啟動任務. demo如下: public static void ex(Connection c

ExecutorService 關閉 and 如何判斷執行任務執行完畢

ExecutorService 關閉1、shutdown 2、shutdownNow 3、awaitTermination當你使用ExecutorService的時候,你應該記得關閉它,這樣這些被管理的執行緒才會停止執行。舉例:如果你的應用通過main()方法啟動,並且你的

Java 執行執行複用是如何實現的?

前幾天,技術群裡有個群友問了一個關於執行緒池的問題,內容如圖所示: ![](https://img-blog.csdnimg.cn/20200614214310802.jpg) 關於執行緒池相關知識可以先看下這篇:[為什麼阿里巴巴Java開發手冊中強制要求執行緒池不允許使用Executors建立?

執行如何確定執行數目

我用C寫了一個執行緒池,但是在寫的時候沒有考慮執行緒池中執行緒的數目,當初直接隨便設定了一個執行緒的數目。 但是在面試時,將常被問到如何設定執行緒池中執行緒的數目的? 我也在網上了搜了一些資料,今天在這裡就說一下“如何設定執行緒池中執行緒的數目?” 執行緒池中執行緒的數目

java執行以程式碼的順序執行,主要是記錄一下繼承執行的內容

1.這個是自定義的執行緒池類,直接上程式碼 package org.jimmy.threadtest20181121; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecut

定製在排程執行執行的任務

Java 9併發程式設計指南 目錄 定製在排程執行緒池中執行的任務 準備工作 實現過程 工作原理 擴充套件學習 更多關注 排程執行緒池是Executor框架基本執行緒池的擴充套件,排程在一段時間後執行任務。ScheduledTh

執行使用ThreadLocal方案

人工手打,翻譯自:https://moelholm.com/2017/07/24/spring-4-3-using-a-taskdecorator-to-copy-mdc-data-to-async-threads 本來想自己寫一篇關於執行緒池threadlocal的,偶然看到這篇文章覺得挺好的,便直接翻譯了

Java執行submit()和execute之間的區別?

一: submit()方法,可以提供Future < T > 型別的返回值。 executor()方法,無返回值。 execute無返回值 public void execute(Runnable command) { if (command == null)

執行ThreadPoolExecutor分析: 執行是什麼時候建立執行的,佇列的任務是什麼時候取出來的?

  帶著幾個問題進入原始碼分析: 執行緒池是什麼時候建立執行緒的? 任務runnable task是先放到core到maxThread之間的執行緒,還是先放到佇列? 佇列中的任務是什麼時候取出來的? 什麼時候會觸發reject策略? core到maxThread之間的執行緒什麼時候會di

執行的柵欄

多執行緒中有三個類,分別是CountDownLatch,CyclicBarrier,Semaphore。代表著執行緒中的柵欄。共享鎖。 CountDownLatch 在一組執行緒中,一個執行緒等待其他執行緒。我把它理解為門栓。 檢視該類的資料結構圖如下圖一 ​ 圖一 有一個靜態的內部類,Sync繼承自A

Java執行的核心執行是如何被重複利用的

在Java開發中,經常需要建立執行緒去執行一些任務,實現起來也非常方便,但如果併發的執行緒數量很多,並且每個執行緒都是執行一個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷燬執行緒需要時間。此時,我們很自然會想到使用執行緒池來解決這個問題。 使用執行緒池的好處

執行常用的阻塞佇列簡述

一、ArrayBlockingQueue 基於陣列的阻塞佇列,有界佇列,按照先進先出(FIFO)的形式,初始化是必須指定capacity.看一下原始碼: /**第一種構造方法,指定初始容量*/ public ArrayBlockingQueue(int capacity) {

關於執行的阻塞佇列BlockingQueue

       接上篇文章https://blog.csdn.net/GoSaint/article/details/84345210        對於BlockingQueue阻塞佇列而言,常用在多執行緒生產者

如何等待java執行所有任務完成

一、等待執行緒池所有執行緒完成: 有時候我們需要等待java thread pool中所有任務完成後再做某些操作,如想要等待所有任務完成,僅需呼叫threadPool.awaitTermination