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

java創(chuàng)建線程池的7種實(shí)現(xiàn)方法

 更新時(shí)間:2023年10月10日 16:38:45   作者:無(wú)形風(fēng)  
在Java中線程池是一種管理線程的機(jī)制,它可以創(chuàng)建一組線程并重復(fù)使用它們,避免了創(chuàng)建和銷(xiāo)毀線程的開(kāi)銷(xiāo),這篇文章主要給大家介紹了關(guān)于java創(chuàng)建線程池的7種實(shí)現(xiàn)方法,需要的朋友可以參考下

這 7 種實(shí)現(xiàn)方法分別是:

  • Executors.newFixedThreadPool:創(chuàng)建一個(gè)固定大小的線程池,可控制并發(fā)的線程數(shù),超出的線程會(huì)在隊(duì)列中等待。
  • Executors.newCachedThreadPool:創(chuàng)建一個(gè)可緩存的線程池,若線程數(shù)超過(guò)處理所需,緩存一段時(shí)間后會(huì)回收,若線程數(shù)不夠,則新建線程。
  • Executors.newSingleThreadExecutor:創(chuàng)建單個(gè)線程數(shù)的線程池,它可以保證先進(jìn)先出的執(zhí)行順序。
  • Executors.newScheduledThreadPool:創(chuàng)建一個(gè)可以執(zhí)行延遲任務(wù)的線程池。
  • Executors.newSingleThreadScheduledExecutor:創(chuàng)建一個(gè)單線程的可以執(zhí)行延遲任務(wù)的線程池。
  • Executors.newWorkStealingPool:創(chuàng)建一個(gè)搶占式執(zhí)行的線程池(任務(wù)執(zhí)行順序不確定)【JDK 1.8 添加】。
  • ThreadPoolExecutor:手動(dòng)創(chuàng)建線程池的方式,它創(chuàng)建時(shí)最多可以設(shè)置 7 個(gè)參數(shù)。

一、用ExecutorService創(chuàng)建線程池

//1.創(chuàng)建一個(gè)大小為10的線程池
ExecutorService threadPool= Executors.newFixedThreadPool(10);
//給線程池添加任務(wù)
for (int i = 0;i < 10;i++){
    threadPool.submit(new Runnable() {
      @Override
      public synchronized void run(){
          //這里寫(xiě)你的方法
          log.info("開(kāi)啟線程..");
      }
  });
}

二、用ThreadPoolExecutor創(chuàng)建線程池

//1.創(chuàng)建一個(gè)大小為10的線程池
BlockingQueue queue = new LinkedBlockingQueue();
ThreadPoolExecutor executor= new ThreadPoolExecutor(10,Integer.MAX_VALUE,10L, TimeUnit.SECONDS,queue);
//給線程池添加任務(wù)
for (int i = 0;i < 10;i++){
executor.execute(new Runnable() {
    @Override
      public synchronized void run(){
          //這里寫(xiě)你的方法
          log.info("開(kāi)啟線程..");
      }
  });
}

從根本上說(shuō)ExecutorService算是通過(guò)ThreadPoolExecutor封裝出來(lái)的他們的底層其實(shí)是一樣的

ThreadPoolExecutor需要傳參,而ExecutorService有默認(rèn)值,值需要一個(gè)線程數(shù)量就可以了。

三、用ThreadPoolUtils工具類(lèi)創(chuàng)建線程池

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.*;
/**
 * 自定義線程創(chuàng)建工具類(lèi),創(chuàng)建線程池后不需要關(guān)閉
 *
 * @author liangxn
 */
public class ThreadPoolUtils {
    private static final Logger LOGGER = LoggerFactory.getLogger(ThreadPoolUtils.class);
    private static ThreadPoolExecutor threadPool = null;
    private static final String POOL_NAME = "myPool";
    // 等待隊(duì)列長(zhǎng)度
    private static final int BLOCKING_QUEUE_LENGTH = 1000;
    // 閑置線程存活時(shí)間
    private static final int KEEP_ALIVE_TIME = 5 * 1000;
    private ThreadPoolUtils() {
        throw new IllegalStateException("utility class");
    }
    /**
     * 無(wú)返回值直接執(zhí)行
     *
     * @param runnable 需要運(yùn)行的任務(wù)
     */
    public static void execute(Runnable runnable) {
        getThreadPool().execute(runnable);
    }
    /**
     * 有返回值執(zhí)行
     * 主線程中使用Future.get()獲取返回值時(shí),會(huì)阻塞主線程,直到任務(wù)執(zhí)行完畢
     *
     * @param callable 需要運(yùn)行的任務(wù)
     */
    public static <T> Future<T> submit(Callable<T> callable) {
        return getThreadPool().submit(callable);
    }
    /**
     * 停止線程池所有任務(wù)
     * @return
     */
    public static synchronized void shutdownNow() {
        getThreadPool().shutdownNow();
    }
    /**
     * 獲取線程池中活躍線程數(shù)
     * @return
     */
    public static int getActiveCount() {
        return getThreadPool().getActiveCount();
    }
    private static synchronized ThreadPoolExecutor getThreadPool() {
        if (threadPool == null) {
            // 獲取處理器數(shù)量
            int cpuNum = Runtime.getRuntime().availableProcessors();
            // 根據(jù)cpu數(shù)量,計(jì)算出合理的線程并發(fā)數(shù)
            int maximumPoolSize = cpuNum * 2 + 1;
            // 核心線程數(shù)、最大線程數(shù)、閑置線程存活時(shí)間、時(shí)間單位、線程隊(duì)列、線程工廠、當(dāng)前線程數(shù)已經(jīng)超過(guò)最大線程數(shù)時(shí)的異常處理策略
            threadPool = new ThreadPoolExecutor(maximumPoolSize - 1,
                    maximumPoolSize,
                    KEEP_ALIVE_TIME,
                    TimeUnit.MILLISECONDS,
                    new LinkedBlockingDeque<>(BLOCKING_QUEUE_LENGTH),
                    new ThreadFactoryBuilder().setNameFormat(POOL_NAME + "-%d").build(),
                    new ThreadPoolExecutor.AbortPolicy() {
                        @Override
                        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
                            LOGGER.warn("線程爆炸了,當(dāng)前運(yùn)行線程總數(shù):{},活動(dòng)線程數(shù):{}。等待隊(duì)列已滿(mǎn),等待運(yùn)行任務(wù)數(shù):{}",
                                    e.getPoolSize(),
                                    e.getActiveCount(),
                                    e.getQueue().size());
                        }
                    });
        }
        return threadPool;
    }
}

總結(jié) 

到此這篇關(guān)于java創(chuàng)建線程池的7種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)java創(chuàng)建線程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java使用zookeeper實(shí)現(xiàn)的分布式鎖示例

    java使用zookeeper實(shí)現(xiàn)的分布式鎖示例

    這篇文章主要介紹了java使用zookeeper實(shí)現(xiàn)的分布式鎖示例,需要的朋友可以參考下
    2014-05-05
  • java 判斷一個(gè)數(shù)是否為2的整數(shù)次冪方法

    java 判斷一個(gè)數(shù)是否為2的整數(shù)次冪方法

    今天小編就為大家分享一篇java 判斷一個(gè)數(shù)是否為2的整數(shù)次冪方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Java多種經(jīng)典排序算法(含動(dòng)態(tài)圖)

    Java多種經(jīng)典排序算法(含動(dòng)態(tài)圖)

    排序算法是老生常談的了,但是在面試中也有會(huì)被問(wèn)到,例如有時(shí)候,在考察算法能力的時(shí)候,不讓你寫(xiě)算法,就讓你描述一下,某個(gè)排序算法的思想以及時(shí)間復(fù)雜度或空間復(fù)雜度。我就遇到過(guò),直接問(wèn)快排的,所以這次我就總結(jié)梳理一下經(jīng)典的十大排序算法以及它們的模板代碼
    2021-04-04
  • java生成驗(yàn)證碼圖片的方法

    java生成驗(yàn)證碼圖片的方法

    這篇文章主要為大家詳細(xì)介紹了java生成驗(yàn)證碼圖片的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 什么是Java布隆過(guò)濾器?如何使用你知道嗎

    什么是Java布隆過(guò)濾器?如何使用你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java布隆過(guò)濾器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 基于jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理實(shí)現(xiàn)及區(qū)別說(shuō)明

    基于jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理實(shí)現(xiàn)及區(qū)別說(shuō)明

    這篇文章主要介紹了基于jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理實(shí)現(xiàn)及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 解決mybatis plus 分頁(yè)查詢(xún)有條數(shù),total和pages都是零的問(wèn)題

    解決mybatis plus 分頁(yè)查詢(xún)有條數(shù),total和pages都是零的問(wèn)題

    這篇文章主要介紹了解決mybatis plus 分頁(yè)查詢(xún)有條數(shù),total和pages都是零的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Java獲取路徑的6種方式代碼示例

    Java獲取路徑的6種方式代碼示例

    在Java中獲取路徑的方法有多種,每種方法適用于不同的場(chǎng)景,這篇文章主要介紹了Java獲取路徑的6種方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • 輕松掌握J(rèn)ava策略模式

    輕松掌握J(rèn)ava策略模式

    這篇文章主要幫助大家輕松掌握J(rèn)ava策略模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 詳細(xì)解讀Java的Lambda表達(dá)式

    詳細(xì)解讀Java的Lambda表達(dá)式

    這篇文章主要介紹了詳細(xì)解讀Java的Lambda表達(dá)式,lambda?表達(dá)式?是Java?8新加入的新特性,它在Java中是引入了函數(shù)式編程這一概念,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

丹巴县| 宕昌县| 上饶县| 连云港市| 临高县| 察隅县| 依兰县| 新野县| 江陵县| 乐安县| 香港 | 东乌珠穆沁旗| 新竹县| 临沧市| 武安市| 甘德县| 比如县| 城步| 伊宁市| 普洱| 兰考县| 东明县| 娄烦县| 云安县| 收藏| 鹤庆县| 唐河县| 库尔勒市| 泽库县| 长沙县| 祁连县| 荔波县| 鄱阳县| 黄陵县| 金门县| 阳东县| 洛南县| 根河市| 石台县| 宜昌市| 礼泉县|