美文网首页
Java多线程(六)线程池

Java多线程(六)线程池

作者: GIT提交不上 | 来源:发表于2020-01-09 16:35 被阅读0次

一、类继承图 & 状态转化

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

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

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

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

二、ThreadPoolExecutor构造方法

  构造方法包括7个参数:

  • 线程池核心线程数最大值
  • 线程池线程总数最大值(核心线程+非核心线程)
  • 非核心线程闲置超时时长
  • 时间单位
  • 线程池任务队列
  1. ArrayBlockingQueue
  2. LinkedBlockingQuene
  3. SynchronousQuene
  4. priorityBlockingQuene
  • 创建线程方式(接口,一般不用,默认为DefaultThreadFactory)
  • 拒绝处理策略
  1. ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 (默认)
  2. ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  3. ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)。
  4. ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。
图2-1 构造方法.png

三、任务执行过程

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

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

  线程池关闭方法:

  • shutdown():不立即终止线程池,等任务队列中的所有任务都执行完成才终止,不会再接收新的任务。
  • shutdownNow():立即终止线程池,打断正在执行的任务,清空任务队列,返回为执行的任务。

四、实例

  常用线程池:

  • Executors.newCacheThreadPool()
  • Executors.newFixedThreadPool(int n)
  • Executors.newScheduledThreadPool(int n)
  • Executors.newSingleThreadExecutor()
//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+"执行完毕!");
    }
}

相关文章

  • Java:线程池Executors.newFixedThread

    摘要:Java,多线程,线程池 多线程编程和线程池概述 (1)多线程程序: 计算机可以实现多任务 ( multit...

  • 10.3多线程详解

    Java高级-多线程 多线程创建 多线程通讯 线程池 1.多线程创建 thread/runnable图:继承Thr...

  • 线程

    Java 并发编程:线程池的使用 Java 并发编程:线程池的使用java 多线程核心技术梳理 (附源码) 本文对...

  • Java源码-线程池

    一、线程池实现原理 Java支持多线程,多线程可以提高任务的执行效率。但是Java里面的线程跟操作系统的线程是一一...

  • Java面试题——多线程

    Java面试题——多线程 1,什么是线程池? 线程池是多线程的一种处理方式,处理过程中将任务提交给线程池,任务执行...

  • java多线程(六)线程池

    什么是线程池,为什么要线程池降低资源消耗,降低创建和销毁的资源消耗提高响应速度:线程的创建时间为T1,执行时间为T...

  • Java多线程(六)线程池

    一、类继承图 & 状态转化   线程池类继承图如下所示:   线程池状态转化图如下所示: 二、ThreadPool...

  • 阿里巴巴Java高级岗必问面试题总结:JVM+多线程+网络+Re

    阿里巴巴Java高级岗必问面试题总结 一、Java多线程相关 线程池的原理,为什么要创建线程池?创建线程池的方式;...

  • 线程的并发工具类

    Java 下多线程的开发我们可以自己启用多线程,线程池,除此之外,Java还为我们提供了Fork-Join、Cou...

  • [第三期:JAVA并发:线程池管理 ThreadPoolExec

    源码不会骗你的!!! 一、背景 JAVA通过多线程的方式实现并发,为了方便线程池的管理,JAVA采用线程池的方式对...

网友评论

      本文标题:Java多线程(六)线程池

      本文链接:https://www.haomeiwen.com/subject/nayyactx.html