一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java的線程池框架及線程池的原理

java的線程池框架及線程池的原理

2020-08-30 11:06Java教程網 Java教程

這篇文章主要介紹了java的線程池框架及線程池的原理的相關資料,需要的朋友可以參考下

java 線程池詳解

什么是線程池?

提供一組線程資源用來復用線程資源的一個池子

為什么要用線程池?

線程的資源是有限的,當處理一組業務的時候,我們需要不斷的創建和銷毀線程,大多數情況下,我們需要反復的進行大量的創建和銷毀工作,這個動作對于服務器而言,也是很浪費的一種情況,這時候我們可以利用線程池來復用這一部分已經創建過的線程資源,避免不斷的創建和銷毀的動作。

線程池的原理

創建好固定數量的線程,吧線程先存下來,有任務提交的時候,把資源放到等待隊列中,等待線程池中的任務隊列不斷的去消費處理這個隊列中的任務

java的線程池原理

有5個核心的屬性:最大線程數量,核心線程數量,等待隊列,任務隊列,拒絕策略

它的執行流程是這樣的:

  1. 工作者workers數量低于核心工作者數corePoolSize時會優先創建一個工作者worker處理job,處理成功則返回。
  2. 工作者workers數量高于核心工作者數時會優先把job放入到待處理隊列,放入隊列成功時處理結束。
  3. 步驟2中入隊失敗會識別工作者數是否還小于最大工作者數maximumPoolsize,小于的話也會新創建一個工作者worker處理job。
  4. 執行拒絕策略

java的線程池框架Executor

Executor里提供了4種類型的線程池:

newCachedThreadPool

  1. 緩存型池子,先查看池中有沒有以前建立的線程,如果有,就 reuse.如果沒有,就建一個新的線程加入池中
  2. 緩存型池子通常用于執行一些生存期很短的異步型任務,因此在一些面向連接的daemon型SERVER中用得不多。但對于生存期短的異步任務,它是Executor的首選。
  3. 能reuse的線程,必須是timeout IDLE內的池中線程,缺省 timeout是60s,超過這個IDLE時長,線程實例將被終止及移出池。

注意,放入CachedThreadPool的線程不必擔心其結束,超過TIMEOUT不活動,其會自動被終止。

newFixedThreadPool

  1. newFixedThreadPool與cacheThreadPool差不多,也是能reuse就用,但不能隨時建新的線程
  2. 其獨特之處:任意時間點,最多只能有固定數目的活動線程存在,此時如果有新的線程要建立,只能放在另外的隊列中等待,直到當前的線程中某個線程終止直接被移出池子
  3. 和cacheThreadPool不同,FixedThreadPool沒有IDLE機制(可能也有,但既然文檔沒提,肯定非常長,類似依賴上層的TCP或UDP IDLE機制之類的),所以FixedThreadPool多數針對一些很穩定很固定的正規并發線程,多用于服務器
  4. 從方法的源代碼看,cache池和fixed 池調用的是同一個底層 池,只不過參數不同:fixed池線程數固定,并且是0秒IDLE(無IDLE),cache池線程數支持0-Integer.MAX_VALUE(顯然完全沒考慮主機的資源承受能力),60秒IDLE

newScheduledThreadPool

  1. 調度型線程池
  2. 這個池子里的線程可以按schedule依次delay執行,或周期執行

SingleThreadExecutor

  1. 單例線程,任意時間池中只能有一個線程
  2. 用的是和cache池和fixed池相同的底層池,但線程數目是1-1,0秒IDLE(無IDLE)

線程池調優

一般來講對于一個線程池沒有固定的合適的參數,只有通過不斷的去調整優化參數,找出最適合自己業務的參數才是最好的調優方式,但是通常來講,線程池的初始化參數設置是有一定的公式可以借鑒的,在開始業務不是足夠膨脹的時候,我們可以通過以下的公式來計算出自己的核心參數的設置。

首先我們要確認業務類型,不同的業務有不同的計算公式:

  1. CPU密集型任務配置盡可能少的線程數量:cpu+1
  2. IO密集型任務則由于需要等待IO操作,線程并不是一直在執行任務,則配置盡可能多的線程,如2*Ncpu。
  3. 混合型的任務,如果可以拆分,則將其拆分成一個CPU密集型任務和一個IO密集型任務,只要這兩個任務執行的時間相差不是太大,那么分解后執行的吞吐率要高于串行執行的吞吐率,如果這兩個任務執行時間相差太大,則沒必要進行分解。我們可以通過Runtime.getRuntime().availableProcessors()方法獲得當前設備的CPU個數。

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/qq_35101189/article/details/62898768

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国内精品一区二区在线观看 | 欧美式禁忌 | 黑人同学征服教师麻麻 | 欧美在线一二三区 | 国产亚洲精品自在线亚洲情侣 | 好男人资源免费播放在线观看 | 无人在线视频高清免费观看动漫 | www.男人的天堂.com | 国产精品合集一区二区 | 40分钟在线观看免费 | 亚洲高清一区二区三区四区 | 美艳教师刘艳第三部166 | 全彩调教侵犯h本子全彩妖气he | 手机看片福利盒子久久 | 小SAO货叫大声点妓女 | 青春娱乐国产分类精品二 | 免费一区在线 | 2022国产在线观看 | 我的绝色岳每雯雯 | 亚洲国产在线2o20 | 韩日视频在线 | 亚洲四虎永久在线播放 | 亚洲乱码尤物193yw在线播放 | 精灵之森高清在线 | 欧美日韩高清不卡一区二区三区 | 日韩国产欧美一区二区三区 | 国产精品一区牛牛影视 | 精品欧美一区二区三区久久久 | 四虎影视网站 | 国产情侣视频观看 | 日本五十路六十30人8时间 | 激情三级做爰在线观看激情 | 国产成人精品s8sp视频 | 日本一区二区三区四区无限 | 日本连裤袜xxxxx在线视频 | 天天干天天色综合网 | 亚洲成熟人网站 | 草莓视频榴莲视频 | 国产精品秒播无毒不卡 | 欧美在线视频免费播放 | 白发在线视频播放观看免费 |