Java多线程(六)线程池

2020-01-09  本文已影响0人  GIT提交不上

一、类继承图 & 状态转化

  线程池类继承图如下所示:

图1-1 线程池类继承图.png

  线程池状态转化图如下所示:

图1-2 线程池状态转化图.png

二、ThreadPoolExecutor构造方法

  构造方法包括7个参数:

  1. ArrayBlockingQueue
  2. LinkedBlockingQuene
  3. SynchronousQuene
  4. priorityBlockingQuene
  1. ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 (默认)
  2. ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  3. ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)。
  4. ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。
图2-1 构造方法.png

三、任务执行过程

  submit()在执行过程中把异常保存在成员变量中,在FutureTask.get阻塞获取的时候再把异常抛出来。线程池execute()执行方法则直接抛出异常,execute()方法执行流程如下所示:

图3-1 任务执行过程.png

  线程池关闭方法:

四、实例

  常用线程池:

//import 省略
/**
 * @author luffy
 * @version 1.0
 * @date 2020/1/09 17:23
 **/
public class Test {
    public static void main(String[] args){
        ExecutorService pool = new ThreadPoolExecutor(5,10,60,TimeUnit.SECONDS,new ArrayBlockingQueue<>(5));
        for (int i=0;i<15;i++){
            Task task = new Task(i);
            pool.execute(task);
            System.out.println("线程池线程数量:"+((ThreadPoolExecutor) pool).getPoolSize());
            System.out.println("队列中等待执行的任务数目:"+((ThreadPoolExecutor) pool).getQueue().size());
            System.out.println("已执行完的任务数目:"+((ThreadPoolExecutor) pool).getCompletedTaskCount());

            System.out.println();
        }
        pool.shutdown();

    }
}

//import 省略
/**
 * @author luffy
 * @version 1.0
 * @date 2020/1/9 16:14
 **/
@Data
public class Task implements Runnable{
    private int num;
    Task(int num){
        this.num = num;
    }
    @Override
    public void run() {
        System.out.println("开始执行"+num+"任务");
        try {
            Thread.currentThread().sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程"+this.num+"执行完毕!");
    }
}
上一篇下一篇

猜你喜欢

热点阅读