【Java并发核心四】Executor 与 ThreadPoolExecutor

Executor ThreadPoolExecutor 实现的是线程池,主要作用是支持高并发的访问处理。

Executor 是一个接口,与线程池有关的大部分类都实现了此接口。

ExecutorService 是 Executor 的子接口;AbstractExecutorService 是 ExecutorService 的实现类,但是是抽象类。

ThreadPoolExecutor 是 AbstractExecutorService 的子类,可实例化。

Executors 是一个工厂类,用于创建线程池。

1、Executors 的 使用:

  (1) newCachedThreadPool()  返回 ExecutorService 实例,创建无界限线程池,理论上线程最大个数是 Integer.MAX_VALUE,使用举例:

     final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        ExecutorService executorService = Executors.newCachedThreadPool();
        // 此线程池运行5个线程
        for (int i = 0; i < 5; i++) {
            final int index = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Thread-" + index + "-begin-" + sf.format(new Date()));
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Thread-" + index + "-end-" + sf.format(new Date()));
                }
            });
        }

  运行结果:

  

  从上图可以看出,线程在execute 加载后,基本是并发执行的,并非顺序执行。

  (2) newFixedThreadPool(int)  返回 ExecutorService 实例,创建的是有界线线程池,即线程个数可以指定最大数量,如果超过最大数量,则后加入的线程需要等待。

    还有api:newFixedThreadPool(int , ThreadFactory),newCachedThreadPool( ThreadFactory ) 方法同理。

  (3) newSingleThreadExecutor() 创建单一线程池,实现以队列的方式来执行任务。

 2、ThreadPoolExecutor 的使用:

  Executors 工厂类中,很多地方是调用的 ThreadPoolExecutor 来实现的,单独调用 ThreadPoolExecutor 要考虑的相对要多一些但也更灵活。

posted @ 2018-10-15 11:22  快乐菠菜  阅读(581)  评论(0编辑  收藏  举报