《多线程》自定义线程池

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import com.google.common.util.concurrent.ThreadFactoryBuilder;

/**
 * 
 * @author kevin
 *
 */
public class TimeServerHandlerExecutePool {

	private ExecutorService executor;

	public TimeServerHandlerExecutePool(int maxPoolSize, int queueSize) {
		//最小活跃线程数  是系统cpu核心数
		int corePoolSize = Runtime.getRuntime().availableProcessors();
		//大于cpu核心数的空闲线程,最长维持120秒销毁.
		long keepAliveTime = 120L ; 
		//阻塞队列
		BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<java.lang.Runnable>(queueSize);
		
		//线程工场,能自定义线程名
		ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
		
		//队列超限,处理策略, 拒绝消息
		//RejectedExecutionHandler rejectedExecutionHandler=new ThreadPoolExecutor.AbortPolicy();
		//队列超限,处理策略, 阻塞放入队列
		RejectedExecutionHandler rejectedExecutionHandler=new CustomRejectedExecutionHandler();
		
		//创建线程池
		executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue ,namedThreadFactory, rejectedExecutionHandler);
	}

	public void execute(java.lang.Runnable task) {
		executor.execute(task);
	}
	
	
    /**
     * 重写拒绝机制
     * @author Administrator
     *
     */
    class CustomRejectedExecutionHandler implements RejectedExecutionHandler {    
    
        @Override    
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {    
            try {  
                // 核心改造点,由blockingqueue的offer改成put阻塞方法  
                executor.getQueue().put(r);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }    
    } 
	
	
	public static void main(String[] args) {
		//自定义线程池,池最大50, 消息最大保留10000
		TimeServerHandlerExecutePool singleExecutor = new TimeServerHandlerExecutePool(50, 10000);
		singleExecutor.execute(new MyThread());
		singleExecutor.execute(new MyThread());
		singleExecutor.execute(new MyThread());
	}
	
	//1.1定义Runnable接口的实现类
	static class MyThread implements Runnable{
	    //1.2重写其中的run方法
	    @Override
	    public void run() {
	            System.out.println(Thread.currentThread().getName()+"===========");
	    }
	    
	}
	
}

猜你喜欢

转载自blog.csdn.net/kaige8312/article/details/84677576