zoukankan      html  css  js  c++  java
  • 线程池-实际生产使用

    各个参数配置 如核心线程数、最大线程数等,可根据项目具体形式以及服务器配置自行修改

    package com.lxt.utils;
    
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.Executors;
    import java.util.concurrent.RejectedExecutionHandler;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.ScheduledFuture;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 线程池
     */
    public final class ThreadPoolManager {
    
        private static ThreadPoolManager sThreadPoolManager = new ThreadPoolManager();
    
        // 核心线程数
        private static final int SIZE_CORE_POOL = 3;
    
        // 最大线程数
        private static final int SIZE_MAX_POOL = 4;
    
        // 线程池维护线程所允许的空闲时间
        private static final int TIME_KEEP_ALIVE = 5000;
    
        //线程池所使用的缓冲队列大小
        private static final int SIZE_WORK_QUEUE = 500;
    
        // 任务调度周期
        private static final int PERIOD_TASK_QOS = 1000;
    
        /*
         * 线程池单例创建方法
         */
        public static ThreadPoolManager newInstance() {
            return sThreadPoolManager;
        }
    
        // 任务缓冲队列
        private final Queue<Runnable> mTaskQueue = new LinkedList<Runnable>();
    
        /*
         * 线程池超出界线时将任务加入缓冲队列
         */
        private final RejectedExecutionHandler mHandler = new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) {
                mTaskQueue.offer(task);
            }
        };
    
        /*
         * 将缓冲队列中的任务重新加载到线程池
         */
        private final Runnable mAccessBufferThread = new Runnable() {
            @Override
            public void run() {
                if (hasMoreAcquire()) {
                    mThreadPool.execute(mTaskQueue.poll());
                }
            }
        };
    
        /*
         * 创建一个调度线程池
         */
        private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    
        /*
         * 通过调度线程周期性的执行缓冲队列中任务
         */
        protected final ScheduledFuture<?> mTaskHandler = scheduler.scheduleAtFixedRate(mAccessBufferThread, 0,
                PERIOD_TASK_QOS, TimeUnit.MILLISECONDS);
    
        /*
         * 线程池
         */
        private final ThreadPoolExecutor mThreadPool = new ThreadPoolExecutor(SIZE_CORE_POOL, SIZE_MAX_POOL,
                TIME_KEEP_ALIVE, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(SIZE_WORK_QUEUE), mHandler);
    
        /*
         * 将构造方法访问修饰符设为私有,禁止任意实例化。
         */
        private ThreadPoolManager() {
        }
    
        public void perpare() {
            if (mThreadPool.isShutdown() && !mThreadPool.prestartCoreThread()) {
                @SuppressWarnings("unused")
                int startThread = mThreadPool.prestartAllCoreThreads();
            }
        }
    
        /*
         * 消息队列检查方法
         */
        private boolean hasMoreAcquire() {
            return !mTaskQueue.isEmpty();
        }
    
        /*
         * 向线程池中添加任务方法
         */
        public void addExecuteTask(Runnable task) {
            if (task != null) {
                mThreadPool.execute(task);
            }
        }
    
        protected boolean isTaskEnd() {
            if (mThreadPool.getActiveCount() == 0) {
                return true;
            } else {
                return false;
            }
        }
    
        public void shutdown() {
            mTaskQueue.clear();
            mThreadPool.shutdown();
        }
    }
  • 相关阅读:
    tarjan无向图缩点
    8、11 T1:入阵曲:复杂度估算,观察规律与性质,数据存储与查询
    容斥系数
    模拟测试12:
    模拟测试11:冷静稳健。
    好的文章
    容器,函数等
    后缀数组:
    HDU5618 Jam's problem again CDQ分治
    P3810 陌上花开 CDQ分治
  • 原文地址:https://www.cnblogs.com/lxtblogs/p/11552898.html
Copyright © 2011-2022 走看看