最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA 自定義線程池的最大線程數設置方法

 更新時間:2020年06月28日 10:27:04   作者:你的龍兒  
這篇文章主要介紹了JAVA 自定義線程池的最大線程數設置方法,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下

一:CPU密集型:

  定義:CPU密集型也是指計算密集型,大部分時間用來做計算邏輯判斷等CPU動作的程序稱為CPU密集型任務。該類型的任務需要進行大量的計算,主要消耗CPU資源。  這種計算密集型任務雖然也可以用多任務完成,但是任務越多,花在任務切換的時間就越多,CPU執(zhí)行任務的效率就越低,所以,要最高效地利用CPU,計算密集型任務同時進行的數量應當等于CPU的核心數。

  特點:

       01:CPU 使用率較高(也就是經常計算一些復雜的運算,邏輯處理等情況)非常多的情況下使用

       02:針對單臺機器,最大線程數一般只需要設置為CPU核心數的線程個數就可以了

       03:這一類型多出現在開發(fā)中的一些業(yè)務復雜計算和邏輯處理過程中。

  代碼示例:

package pool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Demo02 {
 public static void main(String[] args) {
  //自定義線程池! 工作中只會使用 ThreadPoolExecutor

  /**
   * 最大線程該如何定義(線程池的最大的大小如何設置!)
   * 1、CPU 密集型,幾核,就是幾,可以保持CPU的效率最高!
   */

  //獲取電腦CPU核數
  System.out.println(Runtime.getRuntime().availableProcessors()); //8核

  ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
    2,               //核心線程池大小
    Runtime.getRuntime().availableProcessors(), //最大核心線程池大?。–PU密集型,根據CPU核數設置)
    3,               //超時了沒有人調用就會釋放
    TimeUnit.SECONDS,        //超時單位
    new LinkedBlockingDeque<>(3),     //阻塞隊列
    Executors.defaultThreadFactory(),    //線程工廠,創(chuàng)建線程的,一般不用動
    new ThreadPoolExecutor.AbortPolicy());  //銀行滿了,還有人進來,不處理這個人的,拋出異常

  try {
   //最大承載數,Deque + Max (隊列線程數+最大線程數)
   //超出 拋出 RejectedExecutionException 異常
   for (int i = 1; i <= 9; i++) {
    //使用了線程池之后,使用線程池來創(chuàng)建線程
    threadPool.execute(()->{
     System.out.println(Thread.currentThread().getName()+" ok");
    });
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   //線程池用完,程序結束,關閉線程池
   threadPool.shutdown();  //(為確保關閉,將關閉方法放入到finally中)
  }
 }
}

二:IO密集型:

  定義:IO密集型任務指任務需要執(zhí)行大量的IO操作,涉及到網絡、磁盤IO操作,對CPU消耗較少,其消耗的主要資源為IO。

    我們所接觸到的 IO ,大致可以分成兩種:磁盤 IO和網絡 IO。

    01:磁盤 IO ,大多都是一些針對磁盤的讀寫操作,最常見的就是文件的讀寫,假如你的數據庫、 Redis 也是在本地的話,那么這個也屬于磁盤 IO。

    02:網絡 IO ,這個應該是大家更加熟悉的,我們會遇到各種網絡請求,比如 http 請求、遠程數據庫讀寫、遠程 Redis 讀寫等等。

       IO 操作的特點就是需要等待,我們請求一些數據,由對方將數據寫入緩沖區(qū),在這段時間中,需要讀取數據的線程根本無事可做,因此可以把 CPU 時間片讓出去,直到緩沖區(qū)寫滿。

既然這樣,IO 密集型任務其實就有很大的優(yōu)化空間了(畢竟存在等待):

       CPU 使用率較低,程序中會存在大量的 I/O 操作占用時間,導致線程空余時間很多,所以通常就需要開CPU核心數兩倍的線程。當線程進行 I/O 操作 CPU 空閑時,線程等待時間所占比例越高,就需要越多線程,啟用其他線程繼續(xù)使用 CPU,以此提高 CPU 的使用率;線程 CPU 時間所占比例越高,需要越少的線程,這一類型在開發(fā)中主要出現在一些計算業(yè)務頻繁的邏輯中。

  代碼示例:

package pool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Demo02 {
 public static void main(String[] args) {
  //自定義線程池! 工作中只會使用 ThreadPoolExecutor

  /**
   * 最大線程該如何定義(線程池的最大的大小如何設置?。?
   * 2、IO 密集型 >判斷你程序中十分耗IO的線程
   *  程序 15個大型任務 io十分占用資源! (最大線程數設置為30)
   *  設置最大線程數為十分耗io資源線程個數的2倍
   */

  //獲取電腦CPU核數
  System.out.println(Runtime.getRuntime().availableProcessors()); //8核

  ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
    2,        //核心線程池大小
    16,                //若一個IO密集型程序有15個大型任務且其io十分占用資源!(最大線程數設置為 2*CPU 數目)
    3,        //超時了沒有人調用就會釋放
    TimeUnit.SECONDS,     //超時單位
    new LinkedBlockingDeque<>(3),  //阻塞隊列
    Executors.defaultThreadFactory(),    //線程工廠,創(chuàng)建線程的,一般不用動
    new ThreadPoolExecutor.DiscardOldestPolicy()); //隊列滿了,嘗試和最早的競爭,也不會拋出異常

  try {
   //最大承載數,Deque + Max (隊列線程數+最大線程數)
   //超出 拋出 RejectedExecutionException 異常
   for (int i = 1; i <= 9; i++) {
    //使用了線程池之后,使用線程池來創(chuàng)建線程
    threadPool.execute(()->{
     System.out.println(Thread.currentThread().getName()+" ok");
    });
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   //線程池用完,程序結束,關閉線程池
   threadPool.shutdown();  //(為確保關閉,將關閉方法放入到finally中)
  }
 }
}

接下來我們進行一一分析:

1:高并發(fā)、任務執(zhí)行時間短的業(yè)務,線程池線程數可以設置為CPU核數+1,減少線程上下文的切換

2:并發(fā)不高、任務執(zhí)行時間長的業(yè)務這就需要區(qū)分開看了:

  a)假如是業(yè)務時間長集中在IO操作上,也就是IO密集型的任務,因為IO操作并不占用CPU,所以不要讓所有的CPU閑下來,可以適當加大線程池中的線程數目,讓CPU處理更多的業(yè)務

  b)假如是業(yè)務時間長集中在計算操作上,也就是計算密集型任務,這個就沒辦法了,線程池中的線程數設置得少一些,減少線程上下文的切換

(其實從一二可以看出無論并發(fā)高不高,對于業(yè)務中是否是cpu密集還是I/O密集的判斷都是需要的當前前提是你需要優(yōu)化性能的前提下)

3:并發(fā)高、業(yè)務執(zhí)行時間長,解決這種類型任務的關鍵不在于線程池而在于整體架構的設計,看看這些業(yè)務里面某些數據是否能做緩存是第一步,我們的項目使用的時redis作為緩存(這類非關系型數據庫還是挺好的)。增加服務器是第二步(一般政府項目的首先,因為不用對項目技術做大改動,求一個穩(wěn),但前提是資金充足),至于線程池的設置,設置參考 2 。最后,業(yè)務執(zhí)行時間長的問題,也可能需要分析一下,看看能不能使用中間件(任務時間過長的可以考慮拆分邏輯放入隊列等操作)對任務進行拆分和解耦。

三.:總結:

  01:一個計算為主的程序(CPU密集型程序),多線程跑的時候,可以充分利用起所有的 CPU 核心數,比如說 8 個核心的CPU ,開8 個線程的時候,可以同時跑 8 個線程的運算任務,此時是最大效率。但是如果線程遠遠超出 CPU 核心數量,反而會使得任務效率下降,因為頻繁的切換線程也是要消耗時間的。因此對于 CPU 密集型的任務來說,線程數等于 CPU 數是最好的了。

  02:如果是一個磁盤或網絡為主的程序(IO密集型程序),一個線程處在 IO 等待的時候,另一個線程還可以在 CPU 里面跑,有時候 CPU 閑著沒事干,所有的線程都在等著 IO,這時候他們就是同時的了,而單線程的話此時還是在一個一個等待的。我們都知道 IO 的速度比起 CPU 來是很慢的。此時線程數等于CPU核心數的兩倍是最佳的。

以上就是JAVA 自定義線程池的最大線程數設置方法的詳細內容,更多關于JAVA 自定義線程池的資料請關注腳本之家其它相關文章!

相關文章

  • Java中ArrayList和LinkedList有什么區(qū)別舉例詳解

    Java中ArrayList和LinkedList有什么區(qū)別舉例詳解

    這篇文章主要介紹了Java中ArrayList和LinkedList區(qū)別的相關資料,包括數據結構特性、核心操作性能、內存與GC影響、擴容機制、線程安全與并發(fā)方案,以及工程實踐場景,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • SpringBoot中接口安全的5種訪問控制方法詳解

    SpringBoot中接口安全的5種訪問控制方法詳解

    在項目開發(fā)種,API接口安全已成為系統(tǒng)設計中不可忽視的關鍵環(huán)節(jié),本文將介紹SpringBoot應用中實現接口安全的5種訪問控制方法,有需要的小伙伴可以了解下
    2025-05-05
  • Spring MVC請求參數接收的全面總結教程

    Spring MVC請求參數接收的全面總結教程

    這篇文章主要給大家總結介紹了關于Spring MVC請求參數接收的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • JavaWeb中Session對象的學習筆記

    JavaWeb中Session對象的學習筆記

    在WEB開發(fā)中,服務器可以為每個用戶瀏覽器創(chuàng)建一個會話對象,即session對象,這篇文章就為大家詳細介紹Session對象的定義、實現原理等基礎知識點,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Spring Boot中自定義注解結合AOP實現主備庫切換問題

    Spring Boot中自定義注解結合AOP實現主備庫切換問題

    這篇文章主要介紹了Spring Boot中自定義注解+AOP實現主備庫切換的相關知識,本篇文章的場景是做調度中心和監(jiān)控中心時的需求,后端使用TDDL實現分表分庫,需要的朋友可以參考下
    2019-08-08
  • JavaMail實現郵件發(fā)送機制

    JavaMail實現郵件發(fā)送機制

    這篇文章主要為大家詳細介紹了JavaMail實現郵件發(fā)送機制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java實現TopK問題的方法

    Java實現TopK問題的方法

    這篇文章主要介紹了Java實現TopK問題的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Java方法的參數傳遞機制實例詳解

    Java方法的參數傳遞機制實例詳解

    這篇文章主要介紹了Java方法的參數傳遞機制,結合實例形式詳細分析了java方法參數傳遞機制原理、實現方法及操作注意事項,需要的朋友可以參考下
    2019-09-09
  • Java中的隱式參數和顯示參數實例詳解

    Java中的隱式參數和顯示參數實例詳解

    這篇文章主要介紹了Java中的隱式參數和顯示參數是什么,另外還有兩個小例子幫助大家理解,需要的朋友可以參考下。
    2017-08-08
  • JNI語言基本知識

    JNI語言基本知識

    JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通信(主要是C&C++)。接下來通過本文給大家分享jni 基礎知識,感興趣的朋友一起看看吧
    2017-10-10

最新評論

通化市| 克山县| 巴东县| 福泉市| 增城市| 河西区| 田阳县| 吴川市| 喀什市| 肥乡县| 大邑县| 万源市| 新化县| 林周县| 永福县| 沐川县| 井研县| 聊城市| 九江县| 沭阳县| 柏乡县| 托里县| 金沙县| 姜堰市| 德阳市| 汝州市| 佛学| 洪泽县| 宝应县| 凯里市| 舒城县| 葵青区| 阳西县| 呈贡县| 曲阳县| 龙南县| 彩票| 阜南县| 蓬安县| 金阳县| 渝北区|