zoukankan      html  css  js  c++  java
  • JAVA 生产者租塞模式的线程池 ThreadPoolExecutor

    package com.dubbo.analyzer.executor;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.RejectedExecutionHandler;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 任务执行者<br/>
     * 当线程不够且线程队列爆满时,会租塞生产者<br/>
     * 此类为单例,必须先调用 init 方法进行初始化.<br/>
     * <a href="http://www.importnew.com/10790.html" target="_blank">http://www.importnew.com/10790.html</a>
     * @author BennyTian
     * @date 2015/01/06
     */
    public class Executor {
    	
    	private Executor() { }
    
    	private static ThreadPoolExecutor executor = null;
    	
    	private static TimeUnit unit = TimeUnit.MINUTES ;
    	private static long keepAliveTime = 1;
    	
    	/**
    	 * 初始化
    	 * @param threadSize	线程数
    	 * @param poolSize		线程租塞队列的容量
    	 */
    	public static void init(Integer threadSize,Integer poolSize){
    		executor = new ThreadPoolExecutor(threadSize, threadSize, keepAliveTime, unit, new ArrayBlockingQueue<Runnable>(threadSize));
    		//异常捕获处理:当线程池达到处理最大极限的时候,调用 queue.put 对生产者进行租塞. execute方法默认使用的是异步的 queue.offer
    		executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
    			@Override
    			public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
    				try {
    					executor.getQueue().put(r);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    	
    	/**
    	 * 执行任务
    	 * @param task
    	 */
    	public static void execute(Runnable task){
    		verify();
    		executor.execute(task);
    	}
    	
    	/**
    	 * 线程池的任务是否全部执行完成
    	 * @return
    	 */
    	public static Boolean isCompleted(){
    		return executor.getActiveCount() == 0;
    	}
    	
    	/**
    	 * 停止任务
    	 */
    	public static void shutdown(){
    		verify();
    		executor.shutdown();
    	}
    	
    	private static void verify(){
    		if(executor==null){
    			throw new RuntimeException("please invoke [ init ] method");
    		}
    	}
    	
    }
    
  • 相关阅读:
    没有上司的舞会
    邮票面值设计
    小木棍
    简单的试炼
    区间质数
    加工生产调度
    泥泞的道路
    总数统计
    中庸之道

  • 原文地址:https://www.cnblogs.com/BennyTian/p/4207778.html
Copyright © 2011-2022 走看看