栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JUC-ThreadPool线程池

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JUC-ThreadPool线程池

1.四种线程池
public class ThreadPool_ {

    public static void main(String[] args) {
        //singleTheadPoolTest();
        //fixTheadPoolTest();
        //cacheThreadPool();
        scheduleThreadPool();
    }

    //corePoolSize=1,maximumPoolSize=1
    //keepAliveTime=0L,时间单位TimeUnit.MILLISECONDS,workQueue=linkedBlockingQueue
    public static void singleTheadPoolTest() {
        ExecutorService pool = Executors.newSingleThreadExecutor();
        for (int i = 1; i <= 10; i++) {
            final int ii = i;
            pool.execute(() -> System.out.println(Thread.currentThread().getName() + "=>" + ii));
        }
    }

    //corePoolSize=n,maximumPoolSize=n
    //keepAliveTime=0L,时间单位TimeUnit.MILLISECONDS,WorkQueue=linkedBlockingQueue
    public static void fixTheadPoolTest() {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
        for (int i = 1; i <= 10; i++) {
            final int ii = i;
            fixedThreadPool.execute(() -> {
                System.out.println(Thread.currentThread().getName() + "=>" + ii);
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    //corePoolSize=0,maximumPoolSize=Integer.MAX_VALUE
    //keepAliveTime=60L,时间单位TimeUnit.SECONDS,workQueue=SynchronousQueue
    public static void cacheThreadPool() {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 1; i <= 100; i++) {
            final int ii = i;
            cachedThreadPool.execute(() -> System.out.println(Thread.currentThread().getName() + "=>" + ii));
        }
    }

    //创建一个定长线程池,支持延迟、周期执行
    //corePoolSize=n,maximumPoolSize=Integer.MAX_VALUE
    //keepAliveTime=0,时间单位TimeUnit.NANOSECONDS;workQueue=DelayedWorkQueue
    public static void scheduleThreadPool() {

        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

        scheduledThreadPool.execute(() -> System.out.println(Thread.currentThread().getName() + " => 普通任务"));

        //delay: the time from now to delay execution
        scheduledThreadPool.schedule(() ->
                        System.out.println(Thread.currentThread().getName() + " => delay3秒后执行"),
                3, TimeUnit.SECONDS);

        //initialDelay: the time to delay first execution
        //period: the period between successive executions
        scheduledThreadPool.scheduleAtFixedRate(() ->
                        System.out.println(Thread.currentThread().getName() + " => first execution延迟2秒,而后按period=3执行"),
                2, 3, TimeUnit.SECONDS);

    }

}

2.ThreadPoolExecutor构造参数
 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler){...}

int corePoolSize 核心线程大小(常驻线程数)
int maximumPoolSize 最大线程数量
long keepAliveTime 线程存活时间
TimeUnit unit 时间单位
BlockingQueue workQueue 阻塞队列
ThreadFactory threadFactory 线程工厂
RejectedExecutionHandler handler 拒绝策略

3.线程池任务执行流程
(1)当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程
(2)当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
(3)当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
(4)当提交任务数超过maximumPoolSize+workQueue时,新提交任务由RejectedExecutionHandler处理
(5)当线程池中的线程的数量大于corePoolSize数量有空闲线程则执行回收,回收时间是keepAliveTime

线程优先向 CorePool 中提交,核心池还没满那么就创建一个新线程去处理任务
在 Corepool 满了之后,线程被提交到任务队列,等待CorePool 线程池空闲
在任务队列满了之后且corePool还没有空闲,那么任务将被提交到 maxPool 中,如果 MaxPool 满了之后执行 task 拒绝策略

4.四种拒绝策略
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常 (defaultHandler)
ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。 
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务 
ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

5.自定义线程池:
public class CustomThreadPool {

    public static void main(String[] args) {
        BlockingQueue queue = new ArrayBlockingQueue<>(10);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 60, TimeUnit.MICROSECONDS, queue);

        for (int i = 1; i <= 20; i++) {
            final int ii = i;
            pool.execute(() -> {
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "=>" + ii);
            });
        }

        pool.shutdown();
    }
    
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/682594.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号