JDK并发包线程池(三)自定义线程池

来源:互联网 发布:php开发实例大全怎么样 编辑:程序博客网 时间:2024/06/07 23:44

自定义线程池就是自己创建ThreadPoolExecutor对象,根据自己的需求指定里面的各个参数
自定义线程池的拒绝策略,需要实现RejectedExecutionHandler接口
自定义线程的创建工厂ThreadFactory,ThreadFactory是一个工厂,自定义ThreadFactory可以跟踪线程池在某个时刻创建了多少个线程,也可以自定义线程的名称,组以及优先级等信息

public class MyThreadExecutorPool {    public static void main(String[] args) {        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10),new ThreadFactory() {            @Override            public Thread newThread(Runnable r) {                Thread thread = new Thread(r);                //将线程设置成为守护线程,这样当主线程退出的时候,线程池就会被销毁了,因为守护线程就是用来为主线程服务的,主线程退出了,守护线程当然退出                //thread.setDaemon(true);                System.out.println("线程创建完毕"+Thread.currentThread().getId());                return thread;            }        },new RejectedExecutionHandler() {            @Override            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {                //DiscardPolicy过于简单,直接就默默地抛弃了不能执行的任务,这里我们可以打印出一些信息                System.out.println(r.toString()+"isDiscard");            }        });        for(int i=0;i<20;i++){            poolExecutor.submit(new MyTask(i));        }    }}class MTask implements Runnable{    private int i;    public MTask(int i) {        super();        this.i = i;    }    @Override    public void run() {        System.out.println(new Date().getTime()+"___"+Thread.currentThread().getId()+"___"+i);        try {            Thread.sleep(3000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

上面程序的运行可能结果:

线程创建完毕1                                         //证明这个方法的调用是由主线程完成的线程创建完毕1线程创建完毕1线程创建完毕1线程创建完毕1//因为corePoolSize=maxmiumPoolSize,并且任务队列是有界队列,当新的任务提交后发现队列满了,线程的数量也达到maxmium,然后就会拒绝执行java.util.concurrent.FutureTask@3fd97efcisDiscard   java.util.concurrent.FutureTask@69dfe453isDiscardjava.util.concurrent.FutureTask@6a073b72isDiscardjava.util.concurrent.FutureTask@cfefc0isDiscardjava.util.concurrent.FutureTask@19501026isDiscard1497184497324___10___11497184497324___11___21497184497324___12___31497184497324___13___41497184497324___9___01497184498324___13___51497184498324___10___61497184498325___11___71497184498326___12___81497184498326___9___91497184499325___13___101497184499325___10___111497184499325___11___121497184499326___12___131497184499326___9___14
原创粉丝点击