`

详解Executors构建线程池

 
阅读更多
Executors
Execcutors提供了一些方便创建ThreadPooleExecutor的方法,主要有:

newFixedThreadPool(int)
创建固定大小的线程池,线程KeepAliveTime为0,默认情况 下,ThreadPoolExecutor中启动的CorePoolSize数量的线程启动后就一直运行,并不会邮于keepAliveTime时间到达后仍没有任务需要执行就退出。缓冲 任务的队列为LinkedBlockingQueue,大小为整形的最大数。当使用此线程池时,在同时执行的Task数量 超过传入的线程池的大小值后,将会放入linkedBlockingQueue,在linkedBlockingQueue中的Task需要等待线程空闲后来执行,当放入linkedBlocking Queue中的Task超过整型最大数时,抛出RejectedExecutionException。

newSingleThreadExecutor()
相当于创建 大小为1单位的固定线程池,当使用此线程池时,同时执行的Task只有1个,其它 的Task都在LinkedBlockingQueue中。

newCachedThreadPool()
创建 CorePoolSize为0,最大线程数为整形的最大数,线程KeepAliveTime为1分钟,缓存任务的队列为SynchronousQueue的线程池。在使用时,放入线程池的Task都会利用线程或启动新线程来执行,直到启动的线程数达到整形最大数据后执行RejectedExecutionException启动后的线程存活时间为1分钟。

NewScheduledThreadPool(int)
创建 corepoolsize为传入参数,最大线程数为整型的最大数,线程keepAliveTime为0,缓存任务的队列为DelayedWorkQueue的线程池。在实际业务中,通常会有一些需要定时或延迟执行的任务,而对于分布式JAVA应用而言,更为典型的则是在异步操作需要超时回调的场景。这种情况下scheduledThreadPoolExecuotr是不错的选择,在JDK5以前的版本中更多的是借助Timer来实现,Timer和SchedUledThreadPoolExecutor主要有以下三方面区别:

1、Timer 只能单线程,一旦Task执行缓慢,变会导致其它的task执行推迟,而如果使用scheduledThreadPoolExecutor,则可自行控制线程数。

2、当Timer中的task抛出RuntimeExecption时,会导致Timer中所有的task不再执行.

3、ScheduledThreadPoolExecutor可执行Callable的Task,从而执行完毕后得到执行结果 。

当要执行Runnable和Callable的Task加入时,ScheduledThreadPoolExecutor会将其放入内部的DelayEdWorkQueue中,DelayedWork Queue 又基于DelayQueue来实现;当有新的Task加入时,DelayQueue会将其加入内部的数组对象中,并进行执行排序。对于ScheduledThreadPoolExecutor而言,排序的规则为执行的时间。执行时间越近的排在越前,线程池中的线程在获取要执行的Task时,方式为获取最近要执行的Task,并调用Condition的awaiNanos 来等待唤醒。ScheduledThreadPoolExecutor和Timer一样,无法确保task在指定的延时时间点执行,这主要是由于到达时间点的时候 CPU可能没有高度到执行Task线程。
分享到:
评论

相关推荐

    Java中Executors类中几种创建各类型线程池

    Java中Executors类中几种创建各类型线程池方法及简单实例

    线程池 Executors

    Java中的线程池Executors java中的线程池Executors是Java并发编程中的一种重要概念,它提供了一种高效、灵活的线程管理机制。使用线程池可以降低资源消耗,提高响应速度,提高线程的可管理性。 线程池的优点 1. ...

    验证阿里巴巴禁用Executors的原因

    【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors返回的线程池对象的弊端如下: 1) ...

    Java多线程Executors批量执行数据实现限流

    java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。 2.数据批量导出。 3任务数据异步执行。 4.多线程...

    线程池相关详解及总结.doc

    线程池设计思路,java提供自带的线程池类ThreadPoolExecutor详解,Executors调用静态方法创建线程池

    顶层接口Executors详解

    顶层接口Executors详解

    线程-线程池-锁-集合-Map-队列.docx

    线程是系统中可执行调度的...线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,规避资源耗尽的风险。集合的详细描述,以及集合中的异同点,HashMap不同jdk版本区别,ConcurrentHashMap介绍。

    java线程池ThreadPoolExecutor类使用详解.docx

    而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,...

    Mina的线程池实现分析

    线程池是并发应用中,为了减少...在mina中大量的使用这一技术,除了Executors的工厂方法构建线程池之外,它还继承自ThreadPoolExecutor提供自己的线程池的实现OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor

    java 线程池管理类:Executors_.docx

    java 线程池管理类:Executors_.docx

    线程池实例:使用Executors和ThreadPoolExecutor

    NULL 博文链接:https://bijian1013.iteye.com/blog/2284676

    线程池的实现以及底层原理.docx

    1. 避免使用Executors工具类创建线程池,应使用ThreadPoolExecutor构造方法创建线程池。 2. 需要根据实际情况指定合适的线程池参数,例如核心线程数、最大线程数、阻塞队列等。 3. 需要对线程池进行监控和维护,例如...

    《〈Java开发手册(泰山版)〉灵魂13问》.zip

    为什么阿里巴巴禁止使用Executors创建线程池?31 为什么阿里巴巴要求谨慎使用ArrayList中的subList方法?37 为什么阿里巴巴不建议在for循环中使用“+”进行字符串拼接?44 为什么阿里巴巴禁止在foreach循环里进行...

    Java线程池文档

    [2]中介绍了java.util.concurrent.Executors类的API。 [3]中介绍了Java中线程池的类体系结构。 [4]中有ThreadPoolExecutor的实例应用。 [5]中有线程池的实例讲解,实现了一个基于线程池的端口监听服务器。★ [6]...

    Executor,Executors,ExecutorService比较.docx

    Executors: 是java.util.concurrent包下的一个类,提供了若干个静态方法,用于生成不同类型的线程池。Executors一共可以创建下面这四类线程池: 1.newFixedThreadPool创建一个可缓存线程池,如果线程池长度超过...

    面试灵魂13问.zip

    为什么阿里巴巴禁止使用 Executors 创建线程池? 31 为什么阿里巴巴要求谨慎使用 ArrayList 中的 subList 方法? 37 为什么阿里巴巴不建议在 for 循环中使用“+”进行字符串拼接? 44 为什么阿里巴巴禁止在 ...

    两种线程池写法

    ThreadPoolManager:Executors.newFixedThreadPool(num * 2);// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程 threadPool: 线程池 创建线程池,销毁线程池,添加新任务

    Spring任务执行和调度

    Spring框架分别使用...Executors是线程池的Java5名称。之所以称作是“执行器”是因为不能保证底层实现实际上是一个池;执行程序可以是单线程的,甚至是同步的。Spring的TaskExecutor接口与java.util.concurren

    android(java)四大线程池详解

    详细的介绍了java/android四大线程池的用法和区别 方便大家进行网络编程

    java socket线程池

     //Runtime的availableProcessors()方法返回当前系统的CPU的数目 //系统的CPU越多,线程池中工作线程的数目也越多 executorService= Executors.newFixedThreadPool(   Runtime.getRuntime()....

Global site tag (gtag.js) - Google Analytics