国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

說一下線程池的核心參數(shù),線程池的執(zhí)行原理

開發(fā)
今天一起來說一下線程池的核心參數(shù),線程池的執(zhí)行原理,大家都知道嗎?

1.線程池的核心參數(shù)

線程池七大核心參數(shù)如下所示:

public ThreadPoolExecutor(int corePoolSize,
        int maximumPoolSize, 
        long keepAliveTime, 
        TimeUnit unit, 
        BlockingQueue<Runnable> workQueue,
        ThreadFactory threadFactory,
        RejectedExecutionHandler handler
        )
  • corePoolSize: 核心線程數(shù)目
  • maximumPoolSize: 最大線程數(shù)目 = (核心線程+救急線程的最大數(shù)目)
  • keepAliveTime: 生存時(shí)間 - 救急線程的生存時(shí)間,生存時(shí)間內(nèi)沒有新任務(wù),此線程資源會釋放
  • unit: 時(shí)間單位 , 救急線程的生存時(shí)間單位,如秒、毫秒等
  • workQueue: 當(dāng)沒有空閑核心線程時(shí),新來任務(wù)會加入到此隊(duì)列排隊(duì),隊(duì)列滿會創(chuàng)建救急線程執(zhí)行任務(wù)
  • **threadFactory: 線程工廠 , 可以定制線程對象的創(chuàng)建,例如設(shè)置線程名字、是否是守護(hù)線程等
  • handler 拒絕策略 - 當(dāng)所有線程都在繁忙,workQueue 也放滿時(shí),會觸發(fā)拒絕策略

思考:線程池的執(zhí)行原理知道嘛?

2. 線程池的執(zhí)行原理

1: 任務(wù)在提交的時(shí)候,首先判斷核心線程數(shù)是否已滿,如果沒有滿則直接添加到工作線程執(zhí)行

2: 如果核心線程數(shù)滿了,則判斷阻塞隊(duì)列是否已滿,如果沒有滿,當(dāng)前任務(wù)存入阻塞隊(duì)列

3:如果阻塞隊(duì)列也滿了,則判斷線程數(shù)是否小于最大線程數(shù),如果滿足條件,則使用臨時(shí)線程執(zhí)行任務(wù)如果核心或臨時(shí)線程執(zhí)行完成任務(wù)后會檢查阻塞隊(duì)列中是否有需要執(zhí)行的線程,如果有,則使用非核心線程執(zhí)行任務(wù)

4:如果所有線程都在忙著(核心線程+臨時(shí)線程),則走拒絕策略

思考:拒絕策略有哪些?

1.AbortPolicy:直接拋出異常,默認(rèn)策略

2.CallerRunsPolicy:用調(diào)用者所在的線程來執(zhí)行任務(wù)

3.DiscardOldestPolicy:丟棄阻塞隊(duì)列中靠最前的任務(wù),并執(zhí)行當(dāng)前任務(wù)

4.DiscardPolicy:直接丟棄任務(wù)

案例:

public class TestThreadPoolExecutor {

    static class MyTask implements Runnable {
        private final String name;
        private final long duration;

        public MyTask(String name) {
            this(name, 0);
        }

        public MyTask(String name, long duration) {
            this.name = name;
            this.duration = duration;
        }

        @Override
        public void run() {
            try {
                LoggerUtils.get("myThread").debug("running..." + this);
                Thread.sleep(duration);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        @Override
        public String toString() {
            return "MyTask(" + name + ")";
        }
    }

    public static void main(String[] args) throws InterruptedException {
        AtomicInteger c = new AtomicInteger(1);
        ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(2);
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                2,
                3,
                0,
                TimeUnit.MILLISECONDS,
                queue,
                r -> new Thread(r, "myThread" + c.getAndIncrement()),
                new ThreadPoolExecutor.AbortPolicy());
        showState(queue, threadPool);
        threadPool.submit(new MyTask("1", 3600000));
        showState(queue, threadPool);
        threadPool.submit(new MyTask("2", 3600000));
        showState(queue, threadPool);
        threadPool.submit(new MyTask("3"));
        showState(queue, threadPool);
        threadPool.submit(new MyTask("4"));
        showState(queue, threadPool);
        threadPool.submit(new MyTask("5",3600000));
        showState(queue, threadPool);
        threadPool.submit(new MyTask("6"));
        showState(queue, threadPool);
    }

    private static void showState(ArrayBlockingQueue<Runnable> queue, ThreadPoolExecutor threadPool) {
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        List<Object> tasks = new ArrayList<>();
        for (Runnable runnable : queue) {
            try {
                Field callable = FutureTask.class.getDeclaredField("callable");
                callable.setAccessible(true);
                Object adapter = callable.get(runnable);
                Class<?> clazz = Class.forName("java.util.concurrent.Executors$RunnableAdapter");
                Field task = clazz.getDeclaredField("task");
                task.setAccessible(true);
                Object o = task.get(adapter);
                tasks.add(o);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        LoggerUtils.main.debug("pool size: {}, queue: {}", threadPool.getPoolSize(), tasks);
    }

}

思考:線程池中有哪些常見的阻塞隊(duì)列?

3. 常見阻塞隊(duì)列

workQueue: 當(dāng)沒有空閑核心線程時(shí),新來任務(wù)會加入到此隊(duì)列排隊(duì),隊(duì)列滿會創(chuàng)建救急線程執(zhí)行任務(wù)。

比較常見的有4個(gè),用的最多是ArrayBlockingQueue和LinkedBlockingQueue。

  • 1.ArrayBlockingQueue:基于數(shù)組結(jié)構(gòu)的有界阻塞隊(duì)列
  • 2.LinkedBlockingQueue:基于鏈表結(jié)構(gòu)的有界阻塞隊(duì)列
  • 3.DelayedWorkQueue :是一個(gè)優(yōu)先級隊(duì)列,它可以保證每次出隊(duì)的任務(wù)都是當(dāng)前隊(duì)列中執(zhí)行時(shí)間最靠前的
  • 4.SynchronousQueue:不存儲元素的阻塞隊(duì)列,每個(gè)插入操作都必須等待一個(gè)移出操作

3.1. ArrayBlockingQueue的LinkedBlockingQueue區(qū)別

inkedBlockingQueue**

ArrayBlockingQueue

默認(rèn)無界,支持有界

強(qiáng)制有界

底層是鏈表

底層是數(shù)組

是懶惰的,創(chuàng)建節(jié)點(diǎn)的時(shí)候添加數(shù)據(jù)

提前初始化 Node  數(shù)組

入隊(duì)會生成新 Node

Node需要是提前創(chuàng)建好的

兩把鎖(頭尾)

一把鎖

左邊是LinkedBlockingQueue加鎖的方式,右邊是ArrayBlockingQueue加鎖的方式

  • LinkedBlockingQueue:讀和寫各有一把鎖,性能相對較好
  • ArrayBlockingQueue:只有一把鎖,讀和寫公用,性能相對于LinkedBlockingQueue差一些

4. 線程池的種類有哪些

在java.util.concurrent.Executors類中提供了大量創(chuàng)建連接池的靜態(tài)方法,常見就有四種

1.創(chuàng)建使用固定線程數(shù)的線程池

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, 
                                      0L, 
                                      TimeUnit.MILLISECONDS, 
                                      new LinkedBlockingQueue<>());
    }
  • 核心線程數(shù)與最大線程數(shù)一樣,沒有救急線程
  • 阻塞隊(duì)列是LinkedBlockingQueue,最大容量為Integer.MAX_VALUE
  • 適用場景:適用于任務(wù)量已知,相對耗時(shí)的任務(wù)
  • 案例
/**
 * @author springboot葵花寶典
 * @description: TODO
 */
public class FixedThreadPoolTest {

    static class FixedThreadDemo implements Runnable{
        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            for (int i = 0; i < 2; i++) {
                System.out.println(name + ":" + i);
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //創(chuàng)建一個(gè)固定大小的線程池,核心線程數(shù)和最大線程數(shù)都是3
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        for (int i = 0; i < 5; i++) {
            executorService.submit(new FixedThreadDemo());
            Thread.sleep(10);
        }

        executorService.shutdown();
    }

}

2.單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任 務(wù),保證所有任務(wù)按照指定順序(FIFO)執(zhí)行

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 
        1, 
        0L,
        TimeUnit.MILLISECONDS, 
        new LinkedBlockingQueue<>()));
    }
  • 核心線程數(shù)和最大線程數(shù)都是1
  • 阻塞隊(duì)列是LinkedBlockingQueue,最大容量為Integer.MAX_VALUE
  • 適用場景:適用于按照順序執(zhí)行的任務(wù)
  • 案例
/**
 * @author springboot葵花寶典
 * @description: TODO
 */
public class NewSingleThreadTest {
    static int count = 0;

    static class Demo implements Runnable {
        @Override
        public void run() {
            count++;
            System.out.println(Thread.currentThread().getName() + ":" + count);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //單個(gè)線程池,核心線程數(shù)和最大線程數(shù)都是1
        ExecutorService exec = Executors.newSingleThreadExecutor();

        for (int i = 0; i < 10; i++) {
            exec.execute(new Demo());
            Thread.sleep(5);
        }
        exec.shutdown();
    }
}
  1. 可緩存線程池
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0,
                                    Integer.MAX_VALUE, 
                                    60L,
                                    TimeUnit.SECONDS, n
                                    ew SynchronousQueue<>());
    }
  • 核心線程數(shù)為0
  • 最大線程數(shù)是Integer.MAX_VALUE
  • 阻塞隊(duì)列為SynchronousQueue:不存儲元素的阻塞隊(duì)列,每個(gè)插入操作都必須等待一個(gè)移出操作
  • 適用場景:適合任務(wù)數(shù)比較密集,但每個(gè)任務(wù)執(zhí)行時(shí)間較短的情況
  • 案例:
/**
 * @author springboot葵花寶典
 * @description: TODO
 */
public class CachedThreadPoolTest {
    static class Demo implements Runnable {
        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            try {
                //修改睡眠時(shí)間,模擬線程執(zhí)行需要花費(fèi)的時(shí)間
                Thread.sleep(100);

                System.out.println(name + "執(zhí)行完了");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //創(chuàng)建一個(gè)緩存的線程,沒有核心線程數(shù),最大線程數(shù)為Integer.MAX_VALUE
        ExecutorService exec = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            exec.execute(new Demo());
            Thread.sleep(1);
        }
        exec.shutdown();
    }
}

4.提供了“延遲”和“周期執(zhí)行”功能的ThreadPoolExecutor

public ScheduledThreadPoolExecutor(int corePoolSize,
                                   ThreadFactory threadFactory,
                                   RejectedExecutionHandler handler{
 super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue(), threadFactory, handler);                     
}
  • 適用場景:有定時(shí)和延遲執(zhí)行的任務(wù)
  • 案例
/**
 * @author springboot葵花寶典
 * @description: TODO
 */
public class ScheduledThreadPoolTest {
    static class Task implements Runnable {
        @Override
        public void run() {
            try {
                String name = Thread.currentThread().getName();

                System.out.println(name + ", 開始:" + new Date());
                Thread.sleep(1000);
                System.out.println(name + ", 結(jié)束:" + new Date());

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //按照周期執(zhí)行的線程池,核心線程數(shù)為2,最大線程數(shù)為Integer.MAX_VALUE
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
        System.out.println("程序開始:" + new Date());

        /**
         * schedule 提交任務(wù)到線程池中
         * 第一個(gè)參數(shù):提交的任務(wù)
         * 第二個(gè)參數(shù):任務(wù)執(zhí)行的延遲時(shí)間
         * 第三個(gè)參數(shù):時(shí)間單位
         */
        scheduledThreadPool.schedule(new Task(), 0, TimeUnit.SECONDS);
        scheduledThreadPool.schedule(new Task(), 1, TimeUnit.SECONDS);
        scheduledThreadPool.schedule(new Task(), 5, TimeUnit.SECONDS);

        Thread.sleep(5000);

        // 關(guān)閉線程池
        scheduledThreadPool.shutdown();

    }
}

5. 線程池面試題

面試官:線程池的核心參數(shù)有哪些?

候選人:

在線程池中一共有7個(gè)核心參數(shù):

  1. corePoolSize 核心線程數(shù)目 - 池中會保留的最多線程數(shù)
  2. maximumPoolSize 最大線程數(shù)目 - 核心線程+救急線程的最大數(shù)目
  3. keepAliveTime 生存時(shí)間 - 救急線程的生存時(shí)間,生存時(shí)間內(nèi)沒有新任務(wù),此線程資源會釋放
  4. unit 時(shí)間單位 - 救急線程的生存時(shí)間單位,如秒、毫秒等
  5. workQueue - 當(dāng)沒有空閑核心線程時(shí),新來任務(wù)會加入到此隊(duì)列排隊(duì),隊(duì)列滿會創(chuàng)建救急線程執(zhí)行任務(wù)
  6. threadFactory 線程工廠 - 可以定制線程對象的創(chuàng)建,例如設(shè)置線程名字、是否是守護(hù)線程等
  7. handler 拒絕策略 - 當(dāng)所有線程都在繁忙,workQueue 也放滿時(shí),會觸發(fā)拒絕策略

在拒絕策略中又有4中拒絕策略

  • 第一種是AbortPolicy,之際拋異常
  • 第二種是CallerRunsPolicy由調(diào)用者執(zhí)行任務(wù)
  • 第三是DiscardOldestPolicy丟棄當(dāng)前的任務(wù)
  • 第四是DiscardPolicy丟棄最早排隊(duì)任務(wù)。默認(rèn)是直接拋異常。

面試官:線程池的執(zhí)行原理知道嗎?

候選人:

首先判斷線程池里的核心線程是否都在執(zhí)行任務(wù),如果不是則創(chuàng)建一個(gè)新的工作線程來執(zhí)行任務(wù)。如果核心線程都在執(zhí)行任務(wù),則線程池判斷工作隊(duì)列是否已滿,如果工作隊(duì)列沒有滿,則將新提交的任務(wù)存儲在這個(gè)工作隊(duì) 列里。如果工作隊(duì)列滿了,則判斷線程池里的線程是否都處于工作狀態(tài),如果沒有,則創(chuàng)建一個(gè)新的工作線程來執(zhí)行任 務(wù)。如果已經(jīng)滿了,則交給拒絕策略來處理這個(gè)任務(wù)。

面試官:線程池的種類有哪些?

候選人:

在jdk中默認(rèn)提供了4中方式創(chuàng)建線程池

  • 第一個(gè)是:newCachedThreadPool創(chuàng)建一個(gè)可緩存線程池,如果線程池長度超過處理需要,可靈活回 收空閑線程,若無可回收,則新建線程。
  • 第二個(gè)是:newFixedThreadPool 創(chuàng)建一個(gè)定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊(duì)列 中等待。
  • 第三個(gè)是:newScheduledThreadPool 創(chuàng)建一個(gè)定長線程池,支持定時(shí)及周期性任務(wù)執(zhí)行。
  • 第四個(gè)是:newSingleThreadExecutor 創(chuàng)建一個(gè)單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任 務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。
責(zé)任編輯:華軒 來源: springboot葵花寶典
相關(guān)推薦

2022-03-09 07:35:24

線程池線程參數(shù)

2011-08-09 15:25:14

線程池數(shù)據(jù)庫連接池

2022-06-06 15:33:20

線程Java釋放鎖

2021-06-02 11:25:18

線程池Java代碼

2012-05-15 02:18:31

Java線程池

2022-11-09 09:01:08

并發(fā)編程線程池

2021-02-01 08:28:24

Linux線程池Linux系統(tǒng)

2020-12-10 08:24:40

線程池線程方法

2021-09-11 07:32:15

Java線程線程池

2024-07-15 08:20:24

2022-02-17 08:02:08

線程Java生命周期

2021-07-31 22:20:00

線程池系統(tǒng)參數(shù)

2009-07-22 09:39:18

CLR線程池

2021-07-16 11:35:20

Java線程池代碼

2020-03-05 15:34:16

線程池C語言局域網(wǎng)

2022-09-26 00:48:14

線程池阻塞數(shù)據(jù)

2017-02-08 13:03:40

Java線程池框架

2024-03-11 08:15:43

參數(shù)線程池方法

2025-08-04 09:00:00

線程池拒絕策略開發(fā)

2023-05-19 08:01:24

Key消費(fèi)場景
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

成人精品视频99在线观看免费| 爱爱爱视频网站| 五月婷婷狠狠操| 丁香久久综合| 国产精品亚洲视频| 日韩欧美一区二区三区在线| 成人在线视频网址| 狠狠狠综合7777久夜色撩人| 手机在线电影一区| 精品久久中文字幕| 日韩免费不卡av| 免费看污黄网站| 韩国精品主播一区二区在线观看 | 媚黑女一区二区| 欧美一二三区在线观看| 亚洲欧洲另类精品久久综合| 182在线播放| 国产精品一级黄| 欧美久久精品午夜青青大伊人| 天天色综合社区| 精品色999| 欧美人妇做爰xxxⅹ性高电影 | 伊人久久亚洲美女图片| 欧美情侣在线播放| 亚洲欧美日韩国产成人综合一二三区| 黑人玩欧美人三根一起进| 老司机免费视频一区二区| 一区二区在线视频| 99re在线观看| 久久视频这里有精品| 欧美成年网站| 亚洲va欧美va人人爽| 91传媒视频在线观看| 免费黄网站在线观看| 肉丝袜脚交视频一区二区| 综合网日日天干夜夜久久| 九九热免费精品视频| 操欧美老女人| 亚洲国产精品va在线看黑人| 黄色片久久久久| 午夜精品久久99蜜桃的功能介绍| 精品国产电影一区二区| 国产精品裸体瑜伽视频| 超碰成人久久| 日韩精品久久久久久久玫瑰园| 国产九九在线观看| 国产日韩欧美| 另类天堂视频在线观看| 九一在线视频| 国产91丝袜在线观看| 日韩av电影手机在线| 免费污视频在线| 综合久久国产九一剧情麻豆| 明星裸体视频一区二区| 大香伊人久久精品一区二区| 欧美日韩免费在线视频| 九色在线视频观看| 精品动漫3d一区二区三区免费| 中文字幕国产精品久久| 女人让男人操自己视频在线观看 | 亚洲精品电影在线一区| 欧美h版在线| 最新的欧美黄色| 亚洲综合在线电影| 久久不射电影网| 精品久久一区二区三区蜜桃| 亚洲91网站| 久久成人在线视频| 7777精品| 国产精品草莓在线免费观看| 综合天天久久| 欧美第一黄网| 在线亚洲自拍| 日韩第一页在线观看| 成人丝袜视频网| 国语对白做受xxxxx在线中国| 中文字幕不卡在线观看| jizzjizz中文| 亚洲va欧美va人人爽午夜| 黄色网址在线播放| 91精品国产综合久久香蕉麻豆| 日本孕妇大胆孕交无码| 亚洲成人久久久| 不卡亚洲精品| 国产午夜精品全部视频在线播放 | 亚洲激情网址| 亚洲精品少妇30p| 老司机午夜免费福利视频| 中文字幕免费精品| 国产精品免费小视频| 免费电影一区二区三区| 国产+人+亚洲| 国产午夜一区| 国产在线98福利播放视频| 中国av在线播放| 亚洲国产精品一区二区久| 在线能看的av网址| 久久天天躁日日躁| 成人午夜网址| 91久久国产精品| 在线综合亚洲| 亚洲午夜精品福利| 2021国产精品久久精品| 91蝌蚪视频在线观看| 欧美精品色一区二区三区| av大全在线免费看| 亚洲天堂av网| 蜜桃在线视频| 日韩在线观看网站| 成人豆花视频| 国产日韩精品电影| 欧洲午夜精品| 欧美日韩精品一区二区天天拍小说 | 久久青青草综合| 四虎影视国产精品| 色综合天天综合网天天狠天天| 1234区在线观看视频免费| 国产无人区一区二区三区| http://嫩草影院| 精品在线视频一区| 国产成人精品亚洲精品| 日韩精品欧美激情一区二区| 欧美网站在线观看| 亚洲小少妇裸体bbw| 精品国产一区二区三区av性色| 91精品国产毛片武则天| 国产乱码精品1区2区3区| 精品日韩欧美| 99久久免费精品| 成人欧美一区二区三区白人 | 伊人手机在线| 国产精品一二| 久久亚洲高清| aa在线免费观看| 成人久久网站| 欧美性一区二区| 毛片毛片毛片毛片| 国产日产亚洲精品系列| 日本久久久网站| 懂色av一区二区在线播放| 久久综合毛片| 成人小视频在线| 天堂男人av| 日韩视频一区二区在线观看| 久久青青视频| 91精品视频免费看| 国产伦精品一区二区三区视频青涩| av动漫在线观看| 欧洲国内综合视频| 91亚洲精品| 国产一区二区三区四区五区在线| 成人亚洲精品久久久久软件| 免费在线黄色av| 亚洲第一天堂无码专区| 在线成人动漫av| 国产精品色悠悠| xfplay精品久久| 蜜桃视频在线观看www社区| 欧美福利视频在线| 欧美专区18| 国产精品三级a三级三级午夜| 欧美本精品男人aⅴ天堂| 日韩成人影院| 国产日本在线播放| 欧美巨大另类极品videosbest| www.成人网| 欧美人与性禽动交精品| 亚洲地区一二三色| 91精品福利观看| 日韩欧美手机在线| 色综合久久久久久久| 女人抽搐喷水高潮国产精品| 亚洲精品自在在线观看| 午夜久久电影网| 成人在线免费| 欧美aaa在线观看| 欧美色图第一页| 欧美男男gaytwinkfreevideos| 国产91在线播放九色快色| 久久综合网色—综合色88| 蜜臀av在线| 精品一区二区三区日本| 亚洲一区二区在线免费观看视频 | 亚洲天堂男人| 91美女在线| 国产精品国产自产拍高清av水多 | 三妻四妾完整版在线观看电视剧| 狠狠色狠狠色综合人人| 色呦呦国产精品| 欧美激情国产在线| 粉嫩欧美一区二区三区| 97香蕉久久超级碰碰高清版| 国产精品国产三级国产aⅴ原创| 久久人人爽人人爽人人片av不| 97xxxxx| 欧美黄色www| 亚洲一区影音先锋| 欧美99在线视频观看| 91欧美在线视频| 婷婷四房综合激情五月|