`

详解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线程。
分享到:
评论

相关推荐

    Executor,Executors,ExecutorService比较.docx

    【Executor、Executors和ExecutorService详解】 在Java并发编程中,`Executor`、`Executors`和`ExecutorService`是核心组件,它们帮助开发者高效管理线程资源,提高程序的并发性能。理解这三个概念的区别和用途是...

    java线程池的使用方式

    `ThreadPoolExecutor`是`ExecutorService`的一个具体实现,也是构建自定义线程池的基础类。它提供了丰富的配置选项来满足各种复杂的线程池需求。 ```java public ThreadPoolExecutor(int corePoolSize, int ...

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

    在《阿里巴巴 Java 开发手册》中,推荐避免使用`Executors`的静态方法创建线程池,因为这些方法创建的线程池可能导致资源耗尽,例如`newFixedThreadPool`创建的线程池大小固定,但未处理的任务可能堆积导致OOM。...

    java 线程池

    ### Java线程池详解 #### 一、线程与线程池的概念 在Java中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程(例如某个Java应用)至少有一个线程,如果线程...

    Java线程池.pdf

    ### Java线程池详解 #### 引言 在现代计算机科学中,线程作为轻量级的进程,已经成为操作系统和应用程序提高并发性、优化资源利用的关键技术之一。线程池,作为线程管理的一种高级机制,更是现代软件工程中不可或...

    java内置线程池 !!!

    构建线程池时需要指定以下参数: 1. **核心线程数**:线程池创建时创建的线程数量。 2. **最大线程数**:线程池允许创建的最大线程数量。 3. **任务队列**:用于存放待执行任务的数据结构。 4. **拒绝策略**:当...

    ServerSocket用法详解

    在这个“ServerSocket用法详解”中,我们将深入探讨如何使用`ServerSocket`来构建服务端应用,并结合`java.util.concurrent`包中的线程池技术,提升服务器的并发处理能力。 首先,让我们了解`ServerSocket`的基本...

    java基于线程池和反射机制实现定时任务完整实例

    Java中的`java.util.concurrent`包提供了线程池服务,其中`Executors`类提供了创建线程池的方法。在本例中,`Executors.newScheduledThreadPool(int corePoolSize)`用于创建一个调度线程池,参数`corePoolSize`表示...

    ServerSocket 用法详解

    ### ServerSocket 用法详解 ...总之,`ServerSocket` 是Java网络编程中非常重要的组成部分,通过合理的构造方法和连接队列长度设置,结合多线程或线程池技术,可以构建高效稳定的服务器应用程序。

    Java多线程编程学习.pdf

    Executors提供了四种预定义的线程池,如FixedThreadPool、SingleThreadExecutor、CachedThreadPool和ScheduledThreadPool,方便快速构建线程池。 五、死锁与活锁 5.1 死锁 当两个或更多线程互相等待对方释放资源,...

    java简单UDP通信代码详解

    本资料主要针对初学者,通过简单的代码示例来讲解如何在Java中实现UDP通信,特别是多线程通信SERVER的构建。 首先,我们需要理解UDP的基本概念。UDP不建立连接,发送数据前不需要确认对方是否在线,也不保证数据包...

    java的concurrent用法详解

    ### Java的Concurrent包用法详解 #### 一、引言 在Java 1.5之前,为了实现多线程的并发操作,开发者通常需要手动编写复杂的代码来处理线程间的同步问题,如使用`synchronized`关键字、`wait()`与`notify()`方法等。...

    Vert.x线程模型揭秘

    #### 三、线程池详解 ##### 1. Event Loop Group - **定义**:这是一个由`NioEventLoopGroup`实例构成的线程池,其大小由`options.getEventLoopPoolSize()`决定,如果没有明确设置,默认值为CPU核心数的两倍。 - *...

    jenkins持续集成部署视频

    - **构建执行器(Executors)**:每个节点上用于执行构建任务的线程池。 #### 四、Jenkins安装与配置 **安装Jenkins**: 1. **下载安装包**:可以从 Jenkins 官方网站下载适合不同操作系统的安装包。 2. **运行...

    JAVA多线程编程详解-详细操作例子

    总之,Java 多线程编程涉及很多概念和技术,正确地理解和使用它们能够帮助开发者构建高效、健壮的并发应用程序。在实践中,需要根据具体需求选择合适的线程创建方式,并合理使用同步机制,避免并发问题,提高程序的...

    JAVA高质量并发详解,多线程并发深入讲解

    介绍线程池的基本概念,如何使用`Executors`创建不同类型的线程池,以及如何自定义`ThreadPoolExecutor`。 - **第16章:Fork/Join框架的应用** 讲解`Fork/Join`框架的工作原理,如何使用`ForkJoinPool`提交任务,...

    Java 高并发六:JDK并发包2详解

    Java并发编程是构建高效、可扩展的服务器端应用的关键技术之一。JDK的并发包提供了丰富的工具类和接口,使得开发者能够有效地管理并发任务。在本文中,我们将深入探讨Java高并发下的线程池和ForkJoin框架。 线程池...

    多线程Java_Socket编程示例

    - 使用`Executors.newFixedThreadPool`创建一个固定大小的线程池`executorService`,线程池大小为系统可用处理器数量乘以预设的`POOL_SIZE`(10)。 - `Runtime.getRuntime().availableProcessors()`方法获取当前...

    java面试题2024资源下载

    ### Java多线程面试知识点详解 #### 一、线程与进程的区别 - **定义**: - **进程**:操作系统中的最小运行单位,每个进程都有独立的内存空间。 - **线程**:进程内的执行序列,是调度和执行的基本单位。 - **...

Global site tag (gtag.js) - Google Analytics