码迷,mamicode.com
首页 > 其他好文 > 详细

ThreadPoolExecutor的参数理解

时间:2015-08-28 17:54:21      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

一、使用Executors创建线程池    

        之前创建线程的时候都是用的Executors的newFixedThreadPool(),newSingleThreadExecutor(),newCachedThreadPool()这三个方法。

    1. newFixedThreadPool()

    创建线程数固定大小的线程池。

   2.newSingleThreadPool()

    创建线程数为1的线程池,

    3.newCachedThreadPool()

    创建可缓冲的线程池。没有大小限制


二、使用ThreadPoolExecutor创建线程池

ThreadPoolExecutor的构造函数

  public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

参数:

        1、corePoolSize核心线程数大小,当线程数<corePoolSize ,会创建线程执行runnable

        2、maximumPoolSize 最大线程数, 当线程数 >= corePoolSize的时候,会把runnable放入workQueue中

        3、keepAliveTime  保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。

        4、unit 时间单位

        5、workQueue 保存任务的阻塞队列

        6、threadFactory 创建线程的工厂

        7、handler 拒绝策略

任务执行顺序:

        1、当线程数小于corePoolSize时,创建线程执行任务。

        2、当线程数大于等于corePoolSize并且workQueue没有满时,放入workQueue中

        3、线程数大于等于corePoolSize并且当workQueue满时,新任务新建线程运行,线程总数要小于maximumPoolSize

        4、当线程总数等于maximumPoolSize并且workQueue满了的时候执行handler的rejectedExecution。也就是拒绝策略。

ThreadPoolExecutor默认有四个拒绝策略:

        1、ThreadPoolExecutor.AbortPolicy()   直接抛出异常RejectedExecutionException

        2、ThreadPoolExecutor.CallerRunsPolicy()    直接调用run方法并且阻塞执行

        3、ThreadPoolExecutor.DiscardPolicy()   直接丢弃后来的任务

        4、ThreadPoolExecutor.DiscardOldestPolicy()  丢弃在队列中队首的任务

当然可以自己继承RejectedExecutionHandler来写拒绝策略.

		int corePoolSize = 1;
		int maximumPoolSize = 2;
		int keepAliveTime = 10;
//		BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
		BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(5);
		ThreadFactory threadFactory = Executors.defaultThreadFactory();
		//线程池和队列满了之后的处理方式
		//1.跑出异常
		RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); 
		RejectedExecutionHandler handler2 = new ThreadPoolExecutor.CallerRunsPolicy();
		RejectedExecutionHandler handler3 = new ThreadPoolExecutor.DiscardPolicy();
		RejectedExecutionHandler handler4 = new ThreadPoolExecutor.DiscardOldestPolicy();

		
		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, threadFactory, handler2);
		
		
		for (int j = 1; j < 15; j++) {
			threadPoolExecutor.execute(new Runnable() {
				
				public void run() {
					
					try {
						System.out.println(Thread.currentThread().getName());
						TimeUnit.SECONDS.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					
				}
			});
		}
		
		System.out.println(threadPoolExecutor);
		
	}









ThreadPoolExecutor的参数理解

标签:

原文地址:http://my.oschina.net/u/2250599/blog/498787

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!