实现线程池

实现线程池

通过以下方法去实现自定义线程池:

public ThreadPoolExecutor(int corePoolSize,
                           int maximumPoolSize,
                           long keepAliveTime,
                           TimeUnit unit,
                           BlockingQueue<Runnable> workQueue,
                           ThreadFactory threadFactory,
                           RejectedExecutionHandler handler) 
public class ThreadPool {         
    private static ThreadPoolExecutor executor = null;
    static {
        executor = new ThreadPoolExecutor(5, 10, 200, 
                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5), new MyTaskThreadFactory(), new AbortPolicy()
                );
        executor.prestartCoreThread(); //预启动一个线程
//        executor.prestartAllCoreThreads();//预启动corePoolSize个线程到线程池
    }

    public static void main(String[] args) {
        System.out.println("线程池线程数: "+executor.getPoolSize());
        for(int i = 0; i<15;i++){
            System.out.println(executor.isShutdown());
            executor.execute(new MyTask(i, "uno线程:"+i));
            System.out.println("线程池线程数: "+executor.getPoolSize());
            System.out.println("阻塞队列中线程数:" + executor.getQueue().size());
            System.out.println("已执行完线程数:" + executor.getCompletedTaskCount());
        }
        executor.shutdown(); //关闭线程池
     }    
}

class MyTaskThreadFactory implements ThreadFactory{
    private static String FACTORYNAME = "MYTASKFACTORY";
    private static List<? super Thread> threadList = new ArrayList<>();

    public void setFactoryName(String name){
        FACTORYNAME = name;
    }
    @Override
    public Thread newThread(Runnable r) {
        synchronized (r) {
            //这里可以自定义个Thread,用了处理在创建线程前后预处理
            Thread t = new Thread(r, FACTORYNAME + threadList.size());
            threadList.add(t);
            return t;
        }
    }
}

class MyTask extends Thread {
    private int num;
    public MyTask(int i, String name) {
        super(name);
        this.num = i;
    }
    @Override
    public void run() {
        try {
            System.out.println(this.getName() + ", 正执行task " + num);
            Thread.sleep(2000);
        } catch (Exception e) {
        }
        System.out.println(this.getName() + ", task " + num + " 执行完成");
    }
}

本人才疏学浅,如有错误,烦请指出,谢谢!

发布了68 篇原创文章 · 获赞 2 · 访问量 1689

猜你喜欢

转载自blog.csdn.net/weixin_45923633/article/details/105032566