`

线程池汇总1

 
阅读更多

一、线程池:

Executors是创建线程池的工厂方法,首先看Executors的所有方法:其中有三个比较常用:



 

以上三个方法返回的对象不同,其实看看源码就清楚了:

public interface ScheduledExecutorService extends ExecutorService {
   ScheduledFuture<?> schedule(Runnable arg0, long arg1, TimeUnit arg3);

   <V> ScheduledFuture<V> schedule(Callable<V> arg0, long arg1, TimeUnit arg3);

   ScheduledFuture<?> scheduleAtFixedRate(Runnable arg0, long arg1, long arg3, TimeUnit arg5);

   ScheduledFuture<?> scheduleWithFixedDelay(Runnable arg0, long arg1, long arg3, TimeUnit arg5);
}

 

一、线程池执行如下:有新任务——>在corePoolSize范围内新增线程处理任务——>corePoolSize满,则放入任务队列——>队列满,则在maximumPoolSize范围内新增线程处理任务——>队列满,报错抛异常

 

二、newFixedThreadPool(int arg)和newSingleThreadScheduledExecutor()线程池结构:

1)先看下newFixedThreadPool(int arg)固定线程数的线程池源码,证明corePoolSize和maximumPoolSize相等,因为任务队列是无界的,所以一般不会用到最大线程参数,跟corePoolSize数量一样即可。

public static ExecutorService newFixedThreadPool(int arg) {
      return new ThreadPoolExecutor(arg, arg, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
   }

 其中ThreadPoolExecutor构造方法为:

public ThreadPoolExecutor(int arg0, int arg1, long arg2, TimeUnit arg4, BlockingQueue<Runnable> arg5, ThreadFactory arg6, RejectedExecutionHandler arg7) {
      this.ctl = new AtomicInteger(ctlOf(-536870912, 0));
      this.mainLock = new ReentrantLock();
      this.workers = new HashSet();
      this.termination = this.mainLock.newCondition();
      if(arg0 >= 0 && arg1 > 0 && arg1 >= arg0 && arg2 >= 0L) {
         if(arg5 != null && arg6 != null && arg7 != null) {
            this.corePoolSize = arg0;
            this.maximumPoolSize = arg1;
            this.workQueue = arg5;
            this.keepAliveTime = arg4.toNanos(arg2);
            this.threadFactory = arg6;
            this.handler = arg7;
         } else {
            throw new NullPointerException();
         }
      } else {
         throw new IllegalArgumentException();
      }
   }

2)newSingleThreadScheduledExecutor()可简单的理解只有一个线程的调度线程池。可以看到其实还是使用的ThreadPoolExecutor类对象,虽然有点区别,但大致可以理解为newFixedThreadPool(int arg)。

 

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
  

三、newScheduledThreadPool(int arg)线程池结构:

先看源码:其中队列使用的是DelayedWorkQueue(详见线程池总结2),定时调度任务由此队列实现:该queue同时具有PriorityQueue(优先级大的元素会放到队首)和DelayQueue(队列里第一个元素的getDelay返回值大于0时,则take调用会阻塞)的功能

public ScheduledThreadPoolExecutor(int arg0) {
      super(arg0, Integer.MAX_VALUE, 0L, TimeUnit.NANOSECONDS, new ScheduledThreadPoolExecutor.DelayedWorkQueue());
   }

 

 

四、拓展:

像newCachedThreadPool()这种,用SynchronousQueue这种队列,即消费者生产者模式,队列里同时最多存在一个任务,被取走后新开一个线程任务处理(线程最大数为Integer最大值),才能再添加进来新的。

public static ExecutorService newCachedThreadPool() {
      return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue());
   }

 

五、对比:

1、newFixedThreadPool 和 newSingleThreadExecutor: 请求处理队列可能会耗费无限大的内存。

2、newCachedThreadPool 和 newScheduledThreadPool: 因为线程最大数是 Integer.MAX_VALUE,也会耗费无限大内存。

 

六、execute和submit:

JDK5往后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,它们的区别是:
execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。——实现Runnable接口
submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。——实现Callable接口

 

 

  • 大小: 46.6 KB
分享到:
评论

相关推荐

    多线程线程池实例及相关资料

    vc++多线程实例、线程池原理及实例相关资料汇总大全

    fixedThreadPoolPlus:支持在线程池中线程耗尽的情况下,将线程池中所有线程当前正在执行那条代码的信息汇总并打印出来,方便定位问题

    支持在线程池中线程耗尽的情况下,将线程池中所有线程当前正在执行那条代码的信息汇总,作为异常信息抛出, 同时将线程全部的完整堆栈信息保存到用户目录下的 "线程名.detail" 文件中,方便定位及排查线程池耗尽时的...

    多线程并行执行,汇总结果

    多线程并行执行,汇总结果、多线程并行执行,汇总结果

    多线程访问mysql数据库

    1.DBSqlMan是多线程访问mysql的动态库 2.mysql5,开源的windows下使用的mysql2次开发库,mysql官网上可以下载 3.testDb,简单的应用DBSqlMan的例子 整个工程已经在VS2005下运行通过,并在实际应用中使用过。提供了...

    BATJ面试题汇总及详解65页

    BATJ面试题汇总及详解65页 JAVA面试题汇总 线程池的原理,为什么要创建线程池?创建线程池的方式? 说说线程安全问题,什么是线程安全,如何实现线程安全? 创建线程池有哪几个核心参数? 如何合理配置线程池的大小...

    Android、java面试技巧及常见性面试题型精编汇总.zip

    线程、多线程和线程池面试专题 Android面试中常被问基础知识点汇总宝典 初级面试专题(中小厂) 混合跨平台开发面试题 设计模式面试专题及答案 中高级专题(View+Handler+Binder) 底层机制突破 面试必备之乐观锁与...

    JDBC技巧汇总.pdf

    JDBC技巧汇总.pdf 个人整理的多项关于jdbc的相干技术文件以及线程池 批量插入 批量修改 批量查询 等

    大厂面试题知识点讲解汇总

    bat面试题之内置对象和四大作用域和页面传值、bat面试题之设计模式和常用的设计模式、bat面试题之实现一个拷贝文件的类使用字节流还是字符串、bat面试题之说说你对Servlet的理解、bat面试题之线程并发库和线程池的...

    Java2023年最新免费面试题及答案附答案汇总.md 免费下载,不需要积分

    什么是线程池 如何实现 Array 和 List 之间的转换 普通类和抽象类有哪些区别 为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object 类里 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么 ...

    Android框架+常用控件汇总-侧滑、上下拉加载、tab、各种ui

    如网络下载,多线程与线程池的管理,数据库ORM,图片缓存管理,图片文件下载上传,Http请求工具,常用工具类(字符串,日期,文件处理,图片处理工具类等),能够使您的应用在团队开发中减少冗余代码,很大的提高了...

    Android面试题汇总

    1.线程、多线程和线程池面试专题 2.BAT Android面试20题详解 3.设计模式面试专题及答案 4.2019Android面试 常见58题 5.初级面试专题(中小厂) 7.设计模式面试专题 8.数据结构面试专题 9.多线程面试专题及答案 10....

    Android+JAVA【面试题】精编汇总(25份).zip

    Android+JAVA【面试题】精编汇总(25份): 2019Android面试 常见58题.docx Android常见原理性面试专题.docx Android面试常问基础知识点.docx BAT Android面试20题详解.docx Java基础面试题.pdf Java;基础知识点面试...

    总结整理的Android面试Java基础知识点面试资料精编汇总文档资料合集.zip

    总结整理的Android面试Java基础知识点面试资料精编汇总文档资料合集: Android面试 常见58题.docx Android常见原理性面试专题.docx Android面试常问基础知识点.docx BAT Android面试20题详解.docx Java基础面试题....

    收集整理的Android【面试】资料精编汇总(25个).zip

    收集整理的Android【面试】资料精编汇总(25个) 2019Android面试 常见58题.docx Android常见原理性面试专题.docx Android面试常问基础知识点.docx BAT Android面试20题详解.docx Java基础面试题.pdf Java;基础知识...

    Android代码-安卓开发学习资料和对应Demo

    Android开发之线程池使用总结 Android学习路线总结,绝对干货 逆流的鱼的博客 汇总优秀的android开发资源 Android学习资源网站索引大全 Android Studiod的配置大全 深入理解Android的startservice和bindservice ...

    多线程知识梳理汇总-思维导图版

    使用思维导图方式,梳理了多线程整体结构,从多线程的介绍到创建线程、线程的生命周期、线程池、锁种类进行梳理。

    509 道 Java 面试题汇总与解析 免费开源!!

    丰富的 Java 技术栈:基础和框架,线程池和锁优化,SpringBoot 和分布式消息队列,数据结构和常用算法,设计模式和 JVM 等 易学易会:提供了大量的图片说明和代码示例 你会获得什么 收获 Java 技术栈的核心知识点 这...

    JAVA面试必成功之JAVA面试秘籍

    JAVA面试秘籍一份通向理想互联网公司的面试汇总,包括Java基础、Java并发、JVM、MySQL、Redis、Spring、MyBatis、Kafka、计算机操作系统、计算机网络、系统设计、分布式、Java项目实战等。Java多线程,包括多线程...

    java中ThreadPoolExecutor常识汇总

    主要介绍了java中ThreadPoolExecutor常识汇总,线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的,需要的朋友可以参考下

    java社招二面面试题有哪些

    二面问题汇总 对象之间的关系 方法重载和重写的区别 线程池有哪些参数 Union和Unionall的区别 redis事务三条命令 redis定时任务 Spring的注解 什么是单例模式 @RequestMapping有什么参数 ConcurrentHashMap怎么实现...

Global site tag (gtag.js) - Google Analytics