`

线程池汇总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
分享到:
评论

相关推荐

    Java8并行流中自定义线程池操作示例

    下面的例子中,我们有一个并行流,这个并行流使用了一个自定义的线程池去计算1到 1,000,000的和。 知识点:可以使用ForkJoinPool的构造方法并设定并行级别来创建一个自定义的线程池。 4. 总结 我们简要地看了一下...

    uThreadPool线程池示例(查找0-1亿之间的质数任务)

    5. 回收结果:所有任务完成后,线程池将结果汇总,可能存储在共享数据结构中。 6. 关闭线程池:所有任务执行完毕后,关闭线程池,释放资源。 在压缩包文件“线程池D7”中,可能包含了`uThreadPool`的源代码、示例...

    Python 应用之线程池.pdf

    首先,Python作为一门高级编程语言,非常适合处理网络密集型的任务,比如控制成百上千台客户机、分发任务和汇总提交等。它能够有效地抽象复杂任务,编写数据采集任务并自动完成各种报表数据的分析及收集。Python通过...

    线程池实现蚁群算法的简单并行

    1. **线程池初始化**:创建一定数量的工作线程,每个线程初始化时可能需要设置一些参数,比如搜索范围、信息素更新规则等。 2. **任务提交**:当需要启动新的搜索任务时,将任务信息(如蚂蚁个体、当前迭代次数)...

    单线程 多线程 线程池 计算随机数的一价和

    在计算随机数的一价和场景中,我们可以设置一个线程池,预先创建好一定数量的线程,每个线程从任务队列中取出一部分随机数进行累加,最后汇总所有线程的计算结果。这种方式既高效又灵活,可以应对任务量的变化。 **...

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

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

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

    每次调用`countDown()`方法时,计数值会减1,当计数值为0时,所有等待的线程会被释放,可以继续执行。这对于实现多线程之间的同步非常有用,确保所有线程都完成任务后,再进行下一步操作。 例如,在一个多线程并行...

    java线程池处理多并发,所有进程执行完后再统一处理结果

    java线程池处理多并发,所有进程执行完后再统一处理结果线程池配置类多线程并行demo 线程池配置类 import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation....

    多线程访问mysql数据库

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

    优秀博文汇总1

    JPA 防踩坑姿势是指在使用 JPA 进行持久层开发时,需要注意的一些关键点,如 LazyInitializationException、N+1 问题、Flush 模式等。 Servlet 3 异步原理与实践 Servlet 3 中引入了异步处理机制,允许开发者使用...

    JAVA面试高频汇总1

    【JAVA面试高频汇总1】 1. **Java容器**:Java中的容器主要分为集合(Collection)和映射(Map)两大类。集合包括List(如ArrayList、LinkedList)、Set(如HashSet、LinkedHashSet)和Queue(如ArrayDeque)。同步...

    Tomcat调优及相关设置汇总-paulen.docx.rar_Tomcat调优及相关设置汇总_flowerd54

    《Tomcat调优及相关设置汇总》是一份详细探讨如何优化Apache Tomcat服务器性能的重要文档,由作者flowerd54编写。Tomcat作为广泛使用的开源Java Servlet容器,其性能调优对于提升Web应用的响应速度和处理能力至关...

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

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

    BATJ面试题汇总及详解(进大厂必看)

    1. 提高性能:线程池可以重用已存在的线程,减少了创建和销毁线程的开销。 2. 控制并发量:通过设置线程池的大小,可以限制同时运行的线程数量,防止过多线程导致系统资源耗尽。 3. 管理线程:线程池提供了一种机制...

    2019金三银四30家公司面试题汇总.doc

    Java 线程池原理是指 Java 中的线程池实现机制,包括线程池的创建、线程的执行和线程的回收等过程。CAS 机制是 Compare-And-Swap 的缩写,是一种原子操作机制,用于实现多线程环境下的同步。Synchronized 是 Java 中...

    Bat面试题汇总&详解

    1. 使用`Executors`类的静态工厂方法,如`newFixedThreadPool`(固定大小线程池)、`newCachedThreadPool`(缓存线程池)、`newSingleThreadExecutor`(单线程线程池)等。 2. 直接使用`ThreadPoolExecutor`类,...

    java高级面试题汇总

    Java高级面试题汇总 本资源摘要信息中,我们将对 Java 高级面试题进行总结和分析,涵盖了 Java 面试题的方方面面,从数据类型转换到框架选择,从线程池状态到 Java 8 的元空间替换,从跳出多重循环到 JSON 对象解析...

    java基础编程题目总汇

    Java基础编程题目总汇是针对Java初学者设计的一系列练习题,旨在巩固和深化Java编程基础知识。这些题目覆盖了从基本语法、数据类型到控制结构、类与对象、异常处理等多个核心领域,对于想要系统性地提升Java编程技能...

Global site tag (gtag.js) - Google Analytics