线程池-简单使用及原理,以及自定义线程池

来源:互联网 发布:saas软件服务协议 编辑:程序博客网 时间:2024/06/14 09:53

借鉴自马伟奇的视腾讯频


首先ThreadPool肯定是比new Thread好的

优点:

1.可以重用线程(重用机制原理在下方)

2.控制最大并发线程数。

3.更多的功能(定时定期执行,单线程,并发数控制)

(在优化性能的方面简直就不谈了)


线程池种类:

1.newCachedThreadPool可缓存线程池,就是重用以前构造的线程,如果没有可用的,就新建。如果一个线程60秒没被使用,就会被终止使之不占资源。

2.newFixedThreadPeel定长线程池,控制线程最大并发数,超出的线程在队列中等待。

3.newScheduledThreadPool定长线程池,支持定时,周期性任务执行。

4.newSingleThreadExcutor单线程化线程池,举一个别人举过的例子,厕所只有一个坑位,排队上(按照FIFO,LIFO,优先级等规则)


系统线程池使用


单线程池


长度为5的线程池


缓存线程池


都很好的印证了我们的猜测


自定义线程池

原理解释:核心线程有5个,工作队列可以容纳100个(这里是暂存的),所以105个以内都是这5兄弟在工作,最大线程10个,也就是说105个除外还可以再用5个,不过不在队列中了,需要新开线程了。所以106个应该是6兄弟在工作,一次类推。110是10兄弟在工作。111的时候就会报错。

110时

106时

111时



上代码

public class PoolTest {    private static ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();    private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);    private static ExecutorService cachedThreadPool = Executors.newCachedThreadPool();    private static MyThreadPool myThreadPool = new MyThreadPool(5, 10);    public static void main(String[] args) throws Exception {        pool(myThreadPool.executor);    }    private static void pool(ExecutorService executorService) {        for (int i = 0; i < 111; i++) {            executorService.execute(new Runnable() {                @Override                public void run() {                    try {                        Thread.sleep(100);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println(Thread.currentThread().getName());                }            });        }    }    static class MyThreadPool {        private ThreadPoolExecutor executor;//        这里简单介绍下sdkThreadPoolExecutor6个属性//        public ThreadPoolExecutor(int corePoolSize, //核心数量//                                  int maximumPoolSize, //最大数量//                                  long keepAliveTime, //超过核心和队列大小的后创建的线程存活时间//                                  TimeUnit unit,//单位//                                  BlockingQueue<Runnable> workQueue,//队列//                                  ThreadFactory threadFactory) {//工厂////        }        MyThreadPool(int coreSize, int maxSize) {            LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);            ThreadFactory sThreadFactory = new ThreadFactory() {                private final AtomicInteger mCount = new AtomicInteger(0);                @Override                public Thread newThread(Runnable runnable) {                    return new Thread(runnable, "Thread-" + mCount.incrementAndGet());                }            };            executor = new ThreadPoolExecutor(coreSize, maxSize, 60L, TimeUnit.SECONDS, workQueue, sThreadFactory);        }    }}

原创粉丝点击