ThreadPoolExecutor 线程池

TestThreadPoolExecutorMain

package core.test.threadpool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * ThreadPoolExecutor 线程池
 * 构造函数参数
 * 
 * 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来写拒绝策略.
 * 
 * @author chenyd 2017年10月24日
 */
public class TestThreadPoolExecutor {
    public static void main(String[] args) {
        Long currentTimeMillis = System.currentTimeMillis();
        // new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
        // unit, workQueue)
        ThreadPoolExecutor threadpool = new ThreadPoolExecutor(3, 10, 3, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(3));

        for (int i = 0; i < 100; i++) {

            try {
                String task = "task=" + i;
                System.out.println("创建任务并提交到线程池:" + task);
                threadpool.execute(new ThreadPoolTast(task));

                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        try {
            threadpool.shutdown();
            boolean loop = true;

            do {
                loop = !threadpool.awaitTermination(2, TimeUnit.SECONDS);
            } while (loop);

            if (loop != true) {
                System.out.println("所有线程执行完毕");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println("耗时:" + (System.currentTimeMillis() - currentTimeMillis));
        }

    }
}

ThreadPoolTast

package core.test.threadpool;

import java.io.Serializable;

public class ThreadPoolTast implements Runnable, Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    private Object attachData;
    
    public ThreadPoolTast(Object tasks) {
        this.attachData=tasks;
    }

    @Override
    public void run() {
        
        try {
            System.out.println("开始执行任务:"+attachData+"任务,使用线程池,线程名称:"+Thread.currentThread().getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        attachData=null;
        
    }
}

 


 

参考链接:

Java四种线程池的使用 http://cuisuqiang.iteye.com/blog/2019372

 

posted @ 2017-11-29 18:45  litblack  阅读(282)  评论(0编辑  收藏  举报