Executor框架

1、Executor具体内容点击打开链接

public class MyExcutor {
	public static void main(String[] args) {
		ThreadPoolExecutor executor = new ThreadPoolExecutor(
				1,	//	corePoolSize 创建时的线程数											
				2,	//maximumPoolSize ;corePoolSize不够时把任务放入队列BlockingQueue<Runnable> workQueue,若队列满了,则根据此数创建不超过次数的线程执行
				60, 	
				TimeUnit.SECONDS,
				new ArrayBlockingQueue<>(3) // BlockingQueue<Runnable> workQueue; corePoolSize不够时,任务放入的队列 分有界和无界
				,new MyRejected()  //拒绝策略 当前面3个都不满足的情况下的拒绝任务的策
				);
public class MyRejected implements RejectedExecutionHandler{

	@Override
	public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
		System.out.println("被拒绝的任务"+r.toString());
	}

}
		MyTask myTask1 = new MyTask(1,"任务1");
		MyTask myTask2 = new MyTask(2,"任务2");
		MyTask myTask3 = new MyTask(3,"任务3");
		MyTask myTask4 = new MyTask(4,"任务4");
		MyTask myTask5 = new MyTask(5,"任务5");
		MyTask myTask6 = new MyTask(6,"任务6");
		executor.execute(myTask1);
		executor.execute(myTask2);
		executor.execute(myTask3);
		executor.execute(myTask4);
		executor.execute(myTask5);
		executor.execute(myTask6);
		executor.shutdown();
		
	}

}

2、java自定义拒绝策略

http://blog.sina.com.cn/s/blog_714cb3040102wc6i.html

 

3、生产者消费者模式

http://ifeve.com/producers-and-consumers-mode/

 

 

4、Concurrent.util常用工具类

:http://blog.csdn.net/defonds/article/details/44021605/

6、某某商城的多线程

6.1、线程池

/**
 * 。。。。。</br> 单例模式
 * 
 * @author ......
 * 
 */
public class ActMutexExecutorServiceUtil {
    /**
     * 等待子线程超时时间
     */
    private static final int AWAIT_TIME = 500;
    /**
     * 设置线程数量
     */
    public static final int THREAD_NUM = Runtime.getRuntime().availableProcessors();

    private static Object obj = new Object();

    private static ExecutorService executor = null;
    
    private ActMutexExecutorServiceUtil() {

    }

    /**
     * 获得一个固定线程池对象executor </br> 线程池数量设定 {@link ActMutexExecutorServiceUtil#THREAD_NUM}
     * 
     * @return ExecutorService
     */
    public static ExecutorService getExecutorServiceInstance() {
        if (executor == null) {
            synchronized (obj) {

                if (executor == null) {
                    executor = Executors.newFixedThreadPool(THREAD_NUM);
                }
            }
        }
        return executor;

    }

    /**
     * 重置线程池
     */
    public static void restartExecutor() {
        executor = null;
        getExecutorServiceInstance();
    }

    /**
     * 关闭并等待子线程在指定时间内来完成处理</br> 时间设定 {@link ActMutexExecutorServiceUtil#AWAIT_TIME} </br> 超时强制关闭子线程</br>
     * 
     * @throws BaseException 异常会强制立即关闭子线程 抛出异常
     */
    public static void shutDown() {
        executor.shutdown();
        try {
            executor.awaitTermination(AWAIT_TIME, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            shutDownNowAndRestart();
            throw new BaseException("SP-SERVICE-ExecutorServiceUtil.shutDown", e);
        }
    }

    /**
     * 立即关闭子线程并重置线程池
     */
    public static void shutDownNowAndRestart() {
        executor.shutdownNow();
        restartExecutor();
    }

}

 

6.2、调用:前面省略一万行

// 。。。。。。。,启动多线程
            int currentInCmmdtyRangeListSize = currentInCmmdtyRangeList.size();
            if (currentInCmmdtyRangeListSize > cmmdtyRangeNumOfThread) {

                int groupCount = 0;
                if (currentInCmmdtyRangeListSize % cmmdtyRangeNumOfThread > 0) {
                    groupCount = currentInCmmdtyRangeListSize / cmmdtyRangeNumOfThread + 1;
                } else {
                    groupCount = currentInCmmdtyRangeListSize / cmmdtyRangeNumOfThread;
                }

                LOGGER.info(PromotionConstants.LOGGER_FORMAT, methodName, "分配任务个数 : " + groupCount + ",uuid:"
                        + checkInputDto.getUuid() + ",serialNo:" + checkInputDto.getSerialNo() + ",actCode:"
                        + checkInputDto.getActivityId());

                int fromIndex = 0;
                int toIndex = cmmdtyRangeNumOfThread;
                int tempToIndex = 0;

                // 获取线程池
                ExecutorService executor = ActMutexExecutorServiceUtil.getExecutorServiceInstance();

                Map<Integer, Future<List<ActGoodsScopeDto>>> cmmdtyRangeMap = new HashMap<Integer, Future<List<ActGoodsScopeDto>>>();

                List<ActGoodsScopeDto> inCmmdtyRangeList = null;

                try {
                    for (int i = 0; i < groupCount; i++) {
                        inCmmdtyRangeList = ActMutexCheckUtil.getSplitCmmdtyRangeList(currentInCmmdtyRangeList,
                                fromIndex, toIndex);

                        cmmdtyRangeMap.put(i, executor.submit(new CommodityMutexCheckCallable(
                                commodityMutexCheckService, inCmmdtyRangeList, actGoodsSetDto
                                        .getCurExcludeCmmdtyCodeMap(), mutexActivityIdList, checkInputDto.getUuid(),
                                checkInputDto.getSerialNo(), checkInputDto.getActivityId())));

                        fromIndex = fromIndex + cmmdtyRangeNumOfThread;
                        tempToIndex = toIndex + cmmdtyRangeNumOfThread;
                        if (tempToIndex > currentInCmmdtyRangeListSize) {
                            toIndex = currentInCmmdtyRangeListSize;
                        } else {
                            toIndex = tempToIndex;
                        }
                    }
                } catch (RejectedExecutionException e) {
                    throw new BaseException(e);
                }

                try {
                    // 将多线程处理结果添加。。。。。
                    for (int i = 0; i < groupCount; i++) {
                        mutexCmmdtyRangeList.addAll(cmmdtyRangeMap.get(i).get());
                    }
                } catch (InterruptedException e) {
                    throw new BaseException(e);
                } catch (ExecutionException e) {
                    throw new BaseException(e);
                }

            } else {
                // 如果当前。。。。没超过指定件数,单线程进行。。
                mutexCmmdtyRangeList = commodityMutexCheckService.findMutexCmmdtyRangeList(currentInCmmdtyRangeList,
                        actGoodsSetDto.getCurExcludeCmmdtyCodeMap(), mutexActivityIdList, checkInputDto.getUuid(),
                        checkInputDto.getSerialNo(), checkInputDto.getActivityId());
            }

后面省略一万行

public class CommodityMutexCheckCallable implements Callable<List<ActGoodsScopeDto>> {

    /**
     * 日志对象
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(CommodityMutexCheckCallable.class);

    private CommodityMutexCheckService commodityMutexCheckService;

    /**
     * 。。
     */
    private List<ActGoodsScopeDto> currentInCmmdtyRangeList;

    /**
     * 。。
     */
    private Map<String, List<String>> currentExCmmdtyRangeMap;

    /**
     * 。。
     */
    private List<String> mutexActivityIdList;

    /**
     * uuid
     */
    private String uuid;

    /**
     * serialNo
     */
    private String serialNo;

    /**
     * 。。
     */
    private String activityId;

    public CommodityMutexCheckCallable(CommodityMutexCheckService commodityMutexCheckService,
            List<ActGoodsScopeDto> currentInCmmdtyRangeList, Map<String, List<String>> currentExCmmdtyRangeMap,
            List<String> mutexActivityIdList, String uuid, String serialNo, String activityId) {
        super();
        this.commodityMutexCheckService = commodityMutexCheckService;
        this.currentInCmmdtyRangeList = currentInCmmdtyRangeList;
        this.currentExCmmdtyRangeMap = currentExCmmdtyRangeMap;
        this.mutexActivityIdList = mutexActivityIdList;
        this.uuid = uuid;
        this.serialNo = serialNo;
        this.activityId = activityId;
    }

    /*
     * (non-Javadoc)
     * @see java.util.concurrent.Callable#call()
     */
    @Override
    public List<ActGoodsScopeDto> call() throws Exception {
        final String methodName = "call";
        LOGGER.info(PromotionConstants.TRACE_START, methodName);

        List<ActGoodsScopeDto> list = commodityMutexCheckService.findMutexCmmdtyRangeList(currentInCmmdtyRangeList,
                currentExCmmdtyRangeMap, mutexActivityIdList, uuid, serialNo, activityId);//调用某某服务(将调用服务放入多线程中执行)

        LOGGER.info(PromotionConstants.TRACE_END, methodName);

        return list;
    }

}

 


 

 

 

 

posted @ 2018-02-26 12:49  MysticalYcc  阅读(3)  评论(0)    收藏  举报