package com.hqyg.disjob.common.thread; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public final class ThreadPoolBuilder { private int schedulerPooleSize = 64; private int corePoolSize = schedulerPooleSize/2; private int maximumPoolSize = schedulerPooleSize; ; private int keepAliveTime = 60000; private final static ThreadPoolBuilder THREAD_POOL_BUILDER = new ThreadPoolBuilder(); private ThreadPoolBuilder(){} public static ThreadPoolBuilder getInstance(){ return THREAD_POOL_BUILDER ; } /** * * @return */ public ThreadPoolExecutor builderExcutorThreadPool(){ ThreadFactory threadFactory = new DefaultThreadFactory("scheduler-job"); //可用线程不够情况下启动线程处理,没有对线程进行丢弃的处理方式 RejectedExecutionHandler newThreadRunsPolicyhandler = new NewThreadRunsPolicy(); BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>(1000); return new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, taskQueue, threadFactory,newThreadRunsPolicyhandler); } /** * * 执行相关状态的线程池,线程池的reject策略采用新建线程方式处理 * @return */ public ThreadPoolExecutor builderRequestExecutorThreadPool(){ ThreadFactory threadFactory = new DefaultThreadFactory("request-executor"); //可用线程不够情况下启动线程处理,没有对线程进行丢弃的处理方式 RejectedExecutionHandler newThreadRunsPolicyhandler = new NewThreadRunsPolicy(); BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>(1000); return new ThreadPoolExecutor(1, maximumPoolSize,keepAliveTime, TimeUnit.MILLISECONDS,taskQueue, threadFactory,newThreadRunsPolicyhandler); } /** * 执行相关状态的线程池,线程池的reject策略采用新建线程方式处理 * @return */ public ThreadPoolExecutor builderExeStateExecutorThreadPool(){ //线程不够情况下使用抛弃旧线程方式 ThreadFactory threadFactory = new DefaultThreadFactory("rpc-response-executor"); BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>(); return new ThreadPoolExecutor(corePoolSize, maximumPoolSize,keepAliveTime, TimeUnit.MILLISECONDS,taskQueue, threadFactory); } public ScheduledExecutorService builderSchedulerThreadPool(){ return Executors.newSingleThreadScheduledExecutor(new DefaultThreadFactory("retrive-message-piple-thread")) ; } public ExecutorService builderSingleThreadExecutor(){ return Executors.newSingleThreadExecutor(new DefaultThreadFactory("RTX-alarm")); } /** * * @return */ public ThreadPoolExecutor builderSubmitRpcThreadPool(){ ThreadFactory threadFactory = new DefaultThreadFactory("exe-rpc-executor"); RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>(1000); ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS,taskQueue, threadFactory, handler); return executor; } static class DefaultThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private final String namePrefix; public DefaultThreadFactory(String poolName) { SecurityManager s = System.getSecurityManager(); group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = poolName +"-" + poolNumber.getAndIncrement() + "-thread-"; } 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; } } }