日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

面試官:聽說你很懂線程池?

來源: 責編: 時間:2024-04-02 17:17:23 179觀看
導讀什么是線程池就是一種池化技術,類似的還有jdbc連接池,對象池。所謂線程池,就是提前創(chuàng)建一堆線程,放到內存(池子)中,需要的時候取一個出來用。如上圖,最頂層的接口就是Executor,實現ExecutorService接口的類,就是對應的線程池類

什么是線程池

就是一種池化技術,類似的還有jdbc連接池,對象池。所謂線程池,就是提前創(chuàng)建一堆線程,放到內存(池子)中,需要的時候取一個出來用。9gZ28資訊網——每日最新資訊28at.com

9gZ28資訊網——每日最新資訊28at.com

如上圖,最頂層的接口就是Executor,實現ExecutorService接口的類,就是對應的線程池類。9gZ28資訊網——每日最新資訊28at.com

如何創(chuàng)建線程池

用Executors工具類,可以很方便地創(chuàng)建各種線程池。(但是實際開發(fā)我們不推薦,阿里巴巴的開發(fā)手冊嚴令禁止使用Executors,應該用ThreadPoolExecutor)Executors 類可以創(chuàng)建多種類型的線程池,每種線程池都有不同的特點和適用場景。9gZ28資訊網——每日最新資訊28at.com

(1) FixedThreadPool(固定大小線程池):9gZ28資訊網——每日最新資訊28at.com

  • 使用 Executors.newFixedThreadPool(int nThreads) 方法創(chuàng)建。
  • 具有固定大小的線程池,即線程數量固定不變。
  • 適用于需要控制線程數量的場景,例如服務器端處理請求。

(2) CachedThreadPool(緩存線程池):9gZ28資訊網——每日最新資訊28at.com

  • 使用 Executors.newCachedThreadPool() 方法創(chuàng)建。
  • 具有自動調整線程數量的線程池,根據需要創(chuàng)建新線程,空閑線程會被回收。
  • 適用于執(zhí)行大量短期異步任務的場景,例如異步IO操作。

(3) SingleThreadPool(單線程線程池):9gZ28資訊網——每日最新資訊28at.com

  • 使用 Executors.newSingleThreadExecutor() 方法創(chuàng)建。
  • 只有一個工作線程的線程池,所有任務按順序執(zhí)行。
  • 適用于需要保證順序執(zhí)行的任務場景,例如日志處理。

(4) ScheduledThreadPool(定時任務線程池):9gZ28資訊網——每日最新資訊28at.com

  • 使用 Executors.newScheduledThreadPool(int corePoolSize) 方法創(chuàng)建。
  • 具有定時執(zhí)行任務的功能,可以按固定的頻率執(zhí)行任務。
  • 適用于需要定時執(zhí)行任務的場景,例如定時任務調度。

(5) WorkStealingPool(工作竊取線程池):9gZ28資訊網——每日最新資訊28at.com

  • 使用 Executors.newWorkStealingPool(int parallelism) 方法創(chuàng)建。
  • 基于ForkJoinPool實現的線程池,每個線程都有自己的任務隊列,可以竊取其他線程的任務來執(zhí)行。
  • 適用于需要處理大量并行任務的場景,例如并行計算任務。

為什么不推薦用Executors創(chuàng)建?9gZ28資訊網——每日最新資訊28at.com

9gZ28資訊網——每日最新資訊28at.com

線程池底層原理

我們以ThreadPoolExecutor為例,它是ExecutorService的一種實現。9gZ28資訊網——每日最新資訊28at.com

9gZ28資訊網——每日最新資訊28at.com

一般我們根據一個類的構造器,可以看出里面的大致思路:9gZ28資訊網——每日最新資訊28at.com

public ThreadPoolExecutor(int corePoolSize,                              int maximumPoolSize,                              long keepAliveTime,                              TimeUnit unit,                              BlockingQueue<Runnable> workQueue,                              ThreadFactory threadFactory,                              RejectedExecutionHandler handler) {        if (corePoolSize < 0 ||            maximumPoolSize <= 0 ||            maximumPoolSize < corePoolSize ||            keepAliveTime < 0)            throw new IllegalArgumentException();        if (workQueue == null || threadFactory == null || handler == null)            throw new NullPointerException();        this.corePoolSize = corePoolSize;        this.maximumPoolSize = maximumPoolSize;        this.workQueue = workQueue;        this.keepAliveTime = unit.toNanos(keepAliveTime);        this.threadFactory = threadFactory;        this.handler = handler;    }

參數很多,但是我們每一個都必須要記住。 這個 ThreadPoolExecutor 的構造函數接受以下參數:一個線程池就好比一家公司,甲方員工干不完需求的時候,就要招一些外包人員駐場開發(fā),如果活干完了,就讓外包撤場,只留下自己的員工。9gZ28資訊網——每日最新資訊28at.com

  • corePoolSize(核心線程數):線程池中保持活躍的線程數量,即使它們處于空閑狀態(tài)。當提交任務時,線程池會嘗試保持至少這么多數量的線程處于活躍狀態(tài)。 就是公司正式員工的數量。
  • maximumPoolSize(最大線程數):線程池中允許的最大線程數量。當任務隊列已滿且核心線程都處于活躍狀態(tài)時,線程池會創(chuàng)建新的線程,直到達到這個最大線程數。 就是公司甲方員工+外包員工的總數,不能超過這個數量。
  • keepAliveTime(線程空閑時間):非核心線程在空閑狀態(tài)下的最長存活時間。超過這個時間,多余的非核心線程將被終止,直到線程數量不超過核心線程數。 如果外包員工長時間沒需求,就通知乙方撤人,裁掉這個非核心人員。當然,甲方爸爸是不會裁的。
  • unit(時間單位):用于指定 keepAliveTime 參數的時間單位,通常是秒、毫秒、微秒等。
  • workQueue(工作隊列):用于保存等待執(zhí)行的任務的阻塞隊列。當所有線程都處于忙碌狀態(tài)時,新提交的任務會被放入這個隊列中等待執(zhí)行。 當需求多到加上外包員工都做不完了,就只能往后排期了。
  • threadFactory(線程工廠):用于創(chuàng)建新線程的工廠。每個新創(chuàng)建的線程都是通過這個工廠創(chuàng)建的。** 就是定義員工的屬性,即工牌,這個員工屬于哪個公司的。**
  • handler(拒絕策略):當任務無法被執(zhí)行時(通常是由于線程池已關閉或者任務隊列已滿),用于處理被拒絕的任務的策略。常見的拒絕策略包括拋出異常、丟棄任務或者在調用者線程中執(zhí)行任務。 默認是不處理。

這些參數可以用于配置 ThreadPoolExecutor 對象,以滿足不同的線程管理需求。9gZ28資訊網——每日最新資訊28at.com

線程池本質就是一個HashSet,所以是無序的。有新的任務提交進來,如果池子還有線程,就直接拿去處理,池子滿了就放入阻塞隊列,等待有線程空閑。9gZ28資訊網——每日最新資訊28at.com

線程數怎么設置比較合理?

這個是沒有銀彈的,我們一般認為CPU密集型的應用,設置為CPU核數N+1。所謂CPU密集型,就是這個程序計算量比較多,還比較頻繁,計算時間長,也就是所謂的比較吃配置,比如是一個專門做算法的服務(組托,配載運算之類的)。 9gZ28資訊網——每日最新資訊28at.com

對于IO密集型的應用,設置為2N+1,什么是IO密集型的應用呢,就是提供數據服務比較多,吞吐量比較大,等待時間長的應用,大部分業(yè)務系統(tǒng)都屬于此類。9gZ28資訊網——每日最新資訊28at.com

除此之外,線程數還跟jvm,機器cpu是否可以超線程(云服務器一般沒法超線程),我們看到的cpu核數一般不是真實的,所以我們推薦先根據常規(guī)設置一個線程數量,上線后根據具體情況再調整就行了。9gZ28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-80831-0.html面試官:聽說你很懂線程池?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 千人規(guī)模敏捷迭代實踐分享,你學會了嗎?

下一篇: JSDoc:一個可選的 TypeScript 替代品

標簽:
  • 熱門焦點
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產品是什么?——是智能音箱。 手機在執(zhí)行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 6月安卓手機性價比榜:Note 12 Turbo斷層式碾壓

    6月份有一個618,雖然這是京東周年慶的日子,但別的電商也都不約而同的跟進了,反正促銷沒壞處,廠商和用戶都能滿意。618期間一些產品也出現了歷史低價,那么各個價位段的產品性價比
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統(tǒng)提供非預期的輸入并監(jiān)視異常結果來發(fā)現軟件漏洞的方法。可以用來發(fā)現應用程序、操作系統(tǒng)和網絡協議等中的漏洞或
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業(yè) 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁&ldquo;充值中心&rdquo;入口上線了本機生活界面。壹覽商業(yè)發(fā)現,該界面目前主要
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發(fā)布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺積電4nm工藝制
  • iQOO Neo8 Pro搶先上架:首發(fā)天璣9200+ 安卓性能之王

    經過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調校的作品。隨著發(fā)布時
Top 主站蜘蛛池模板: 吉安市| 固阳县| 新余市| 鄂伦春自治旗| 扶余县| 铜山县| 兴安县| 石家庄市| 邵阳市| 伊金霍洛旗| 镇坪县| 天津市| 岗巴县| 容城县| 巨鹿县| 德庆县| 菏泽市| 贺州市| 呼玛县| 禹州市| 黎城县| 新乡县| 会同县| 阿鲁科尔沁旗| 岳阳市| 天水市| 潞城市| 岳阳县| 广灵县| 株洲市| 达孜县| 宜君县| 汉川市| 博罗县| 南丹县| 建水县| 习水县| 邮箱| 文水县| 延津县| 鞍山市|