线程池

作者: 笑才 | 来源:发表于2018-10-27 20:24 被阅读0次

1、关系简介
Executor(接口)-->ExecutorService(接口)-->AbstractExecutorService(抽象类) -->ThreadPoolExecutor(类)
2、ThreadPoolExecutor实现线程池

public class ThreadPoolTest01 {
    public static void main(String[] args) {
        //new ThreadPoolExecutor(核心线程数,最大线程数,线程存活时间,存活时间的单位,线程缓存队列,线程池拒绝策略);
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200L,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(5));
        //ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200L,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(5),new ThreadPoolExecutor.DiscardPolicy());
        for(int i =1;i<=20;i++){
            MyThreadPool01 mythread = new MyThreadPool01(i);
            executor.execute(mythread);//提交线程到线程池,并执行调度
            System.out.println("线程池中线程数:"+executor.getPoolSize()+",队列中等待执行的任务数:"+executor.getQueue().size()+",已执行完的任务数:"+executor.getCompletedTaskCount());
        }
        executor.shutdown();//关闭线程池(等待缓存的所有线程执行完毕之后再关闭线程池),executor.shutdownNow(),这个是立即关闭线程池
    }
}
class MyThreadPool01 implements Runnable{
    private int i;
    public MyThreadPool01(int i){
        this.i = i;
    }
    public void run() {
        System.out.println("正在执行任务:"+i);
        try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}
        System.out.println("任务"+i+"执行完毕");
    }   
}

new ThreadPoolExecutor(核心线程数,最大线程数,线程存活时间,存活时间的单位,线程缓存队列,线程池拒绝策略);
线程缓存队列:ArrayBlockingQueue,创建时必须指定大小,LinkedBlockingQueue,synchronousQueue
线程池拒绝策略:ThreadPoolExecutor.AbortPolicy丢弃并抛出异常,ThreadPoolExecutor.DiscardPolicy丢弃不抛弃异常,ThreadPoolExecutor.DiscardOldestPolicy丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程),ThreadPoolExecutor.CallerRunsPolicy由调用线程处理该任务

注意如果设置ThreadPoolExecutor.DiscardPolicy,ThreadPoolExecutor.DiscardOldestPolicy策略时,如果需要通过Future获取返回值,则会出现问题

3、Executors.newFixedThreadPool(5),Executors.newCachedThreadPool(),Executors.newSingleThreadExecutor()创建线程池(java doc中推荐池使用方式)

public class ThreadPoolTest02 {
    public static void main(String[] args) {
        //new ThreadPoolExecutor(核心线程数,最大线程数,线程存活时间,存活时间的单位,线程缓存队列,线程池拒绝策略);
        //ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200L,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(5));
        ExecutorService executor = Executors.newFixedThreadPool(5);//创建固定容量大小的缓冲池
        //Executors.newCachedThreadPool();创建一个缓冲池,缓冲池大小为Integer.MAX_VALUE
        //Executors.newSingleThreadExecutor();创建一个容量为1的缓冲池
        for(int i =1;i<=20;i++){
            MyThreadPool02 mythread = new MyThreadPool02(i);
            executor.execute(mythread);//提交线程到线程池,并执行调度
            //executor.submit(mythread);有Future返回值
        }
        executor.shutdown();//关闭线程池(等待缓存的所有线程执行完毕之后再关闭线程池),executor.shutdownNow(),这个是立即关闭线程池
    }
}
class MyThreadPool02 implements Runnable{
    private int i;
    public MyThreadPool02(int i){
        this.i = i;
    }
    public void run() {
        System.out.println("正在执行任务:"+i);
        try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}
        System.out.println("任务"+i+"执行完毕");
    }   
}

参考:https://www.cnblogs.com/dolphin0520/p/3932921.html

相关文章

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • Spring Boot之ThreadPoolTaskExecut

    初始化线程池 corePoolSize 线程池维护线程的最少数量keepAliveSeconds 线程池维护线程...

  • 线程池

    1.线程池简介 1.1 线程池的概念 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性...

  • 多线程juc线程池

    java_basic juc线程池 创建线程池 handler是线程池拒绝策略 排队策略 线程池状态 RUNNIN...

  • ThreadPoolExecutor线程池原理以及源码分析

    线程池流程: 线程池核心类:ThreadPoolExecutor:普通的线程池ScheduledThreadPoo...

  • 线程池

    线程池 [TOC] 线程池概述 什么是线程池 为什么使用线程池 线程池的优势第一:降低资源消耗。通过重复利用已创建...

  • java 线程池使用和详解

    线程池的使用 构造方法 corePoolSize:线程池维护线程的最少数量 maximumPoolSize:线程池...

  • 线程池

    JDK线程池 为什么要用线程池 线程池为什么这么设计 线程池原理 核心线程是否能被回收 如何回收空闲线程 Tomc...

网友评论

      本文标题:线程池

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