线程池

线程池基本介绍参考链接:https://blog.csdn.net/a1275302036/article/details/116662394

创建线程池参数

public ThreadPoolExecutor(int corePoolSize,
                         int maximumPoolSize,
                         long keepAliveTime,
                         TimeUnit unit,
                         BlockingQueue<Runnable> workQueue,
                         ThreadFactory threadFactory,
                         RejectedExecutionHandler handler) {
                         // 省略相关代码
}

 

corePoolSize:核心线程数
maximumPoolSize:最大线程数,(最大线程数包含核心线程数)
keepAliveTime:最大线程数的存活时间。(核心线程即便无任务也不会清除,其他线程都是有存货时间的 这就是存活时间)
unit: keepAliveTime的单位
workQueue:阻塞(等待)队列
threadFactory :创建线程的工厂,主要是创建线程设置优先级和是否为守护线程。
handler:拒绝策略

 

线程池工具类

package com.jlpay.agent.query.enums;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 固定大小线程池工具
 *
 * @author heyaolei
 * @since 2022/3/23
 */
public enum FixedThreadPoolUtil {

    /**
     * 单例-固定线程池工具
     */
    INSTANCE;

    private ExecutorService pool;

    FixedThreadPoolUtil() {
        LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(5_000);
        pool = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, queue, new ThriftThreadFactory());
    }

    static class ThriftThreadFactory implements ThreadFactory {
        private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;

        ThriftThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
            namePrefix = "customized-thread-pool-" + POOL_NUMBER.getAndIncrement() + "-thread-";
        }

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(),
                    0);
      //设置非守护线程
if (t.isDaemon()) { t.setDaemon(false); }
        //设置固定优先级
if (t.getPriority() != Thread.NORM_PRIORITY) { t.setPriority(Thread.NORM_PRIORITY); } return t; } } /** * 执行任务 * * @param task 任务 */ public void execute(Runnable task) { pool.execute(task); } }

创建线程池

        FixedThreadPoolUtil.INSTANCE.execute(() -> {
}

 

 

阻塞队列:

概念:任务进来的太多,已经超过了核心线程数的时候就要阻塞排队。

参考:https://www.cnblogs.com/Mateo-dengmin/p/15855151.html

LinkedBlockingQueue:    可以存储数据,可以设置容量 ,超过设置的容量后阻塞。 如果不设置容量就是无限大。

SynchronousQueue:       不可以存储数据,生产一条消息之后需要消费之后再生产。如果生产完没有消费  生产会阻塞,如果消费后没有生产  消费阻塞。

DelayedWorkQueue:      根据任务延迟时间排队。

 

拒绝策略:

概念:当线程池中 线程数量等于最大线程数量 且 任务队列已满时,则会执行线程池会对新增加的任务执行拒绝策略。

CallerRunsPolicy : 由调用线程处理

AbortPolicy :丢弃任务,抛出RejectedExecutionException

DiscardPolicy: 丢弃任务,不抛出异常

DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)

 

posted on 2022-04-19 21:03  周公  阅读(21)  评论(0编辑  收藏  举报

导航