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详解】 在Java并发编程中,`Executor`、`Executors`和`ExecutorService`是核心组件,它们帮助开发者高效管理线程资源,提高程序的并发性能。理解这三个概念的区别和用途是...
`ThreadPoolExecutor`是`ExecutorService`的一个具体实现,也是构建自定义线程池的基础类。它提供了丰富的配置选项来满足各种复杂的线程池需求。 ```java public ThreadPoolExecutor(int corePoolSize, int ...
在《阿里巴巴 Java 开发手册》中,推荐避免使用`Executors`的静态方法创建线程池,因为这些方法创建的线程池可能导致资源耗尽,例如`newFixedThreadPool`创建的线程池大小固定,但未处理的任务可能堆积导致OOM。...
### Java线程池详解 #### 一、线程与线程池的概念 在Java中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程(例如某个Java应用)至少有一个线程,如果线程...
### Java线程池详解 #### 引言 在现代计算机科学中,线程作为轻量级的进程,已经成为操作系统和应用程序提高并发性、优化资源利用的关键技术之一。线程池,作为线程管理的一种高级机制,更是现代软件工程中不可或...
构建线程池时需要指定以下参数: 1. **核心线程数**:线程池创建时创建的线程数量。 2. **最大线程数**:线程池允许创建的最大线程数量。 3. **任务队列**:用于存放待执行任务的数据结构。 4. **拒绝策略**:当...
在这个“ServerSocket用法详解”中,我们将深入探讨如何使用`ServerSocket`来构建服务端应用,并结合`java.util.concurrent`包中的线程池技术,提升服务器的并发处理能力。 首先,让我们了解`ServerSocket`的基本...
Java中的`java.util.concurrent`包提供了线程池服务,其中`Executors`类提供了创建线程池的方法。在本例中,`Executors.newScheduledThreadPool(int corePoolSize)`用于创建一个调度线程池,参数`corePoolSize`表示...
### ServerSocket 用法详解 ...总之,`ServerSocket` 是Java网络编程中非常重要的组成部分,通过合理的构造方法和连接队列长度设置,结合多线程或线程池技术,可以构建高效稳定的服务器应用程序。
Executors提供了四种预定义的线程池,如FixedThreadPool、SingleThreadExecutor、CachedThreadPool和ScheduledThreadPool,方便快速构建线程池。 五、死锁与活锁 5.1 死锁 当两个或更多线程互相等待对方释放资源,...
本资料主要针对初学者,通过简单的代码示例来讲解如何在Java中实现UDP通信,特别是多线程通信SERVER的构建。 首先,我们需要理解UDP的基本概念。UDP不建立连接,发送数据前不需要确认对方是否在线,也不保证数据包...
### Java的Concurrent包用法详解 #### 一、引言 在Java 1.5之前,为了实现多线程的并发操作,开发者通常需要手动编写复杂的代码来处理线程间的同步问题,如使用`synchronized`关键字、`wait()`与`notify()`方法等。...
#### 三、线程池详解 ##### 1. Event Loop Group - **定义**:这是一个由`NioEventLoopGroup`实例构成的线程池,其大小由`options.getEventLoopPoolSize()`决定,如果没有明确设置,默认值为CPU核心数的两倍。 - *...
- **构建执行器(Executors)**:每个节点上用于执行构建任务的线程池。 #### 四、Jenkins安装与配置 **安装Jenkins**: 1. **下载安装包**:可以从 Jenkins 官方网站下载适合不同操作系统的安装包。 2. **运行...
总之,Java 多线程编程涉及很多概念和技术,正确地理解和使用它们能够帮助开发者构建高效、健壮的并发应用程序。在实践中,需要根据具体需求选择合适的线程创建方式,并合理使用同步机制,避免并发问题,提高程序的...
介绍线程池的基本概念,如何使用`Executors`创建不同类型的线程池,以及如何自定义`ThreadPoolExecutor`。 - **第16章:Fork/Join框架的应用** 讲解`Fork/Join`框架的工作原理,如何使用`ForkJoinPool`提交任务,...
Java并发编程是构建高效、可扩展的服务器端应用的关键技术之一。JDK的并发包提供了丰富的工具类和接口,使得开发者能够有效地管理并发任务。在本文中,我们将深入探讨Java高并发下的线程池和ForkJoin框架。 线程池...
- 使用`Executors.newFixedThreadPool`创建一个固定大小的线程池`executorService`,线程池大小为系统可用处理器数量乘以预设的`POOL_SIZE`(10)。 - `Runtime.getRuntime().availableProcessors()`方法获取当前...
### Java多线程面试知识点详解 #### 一、线程与进程的区别 - **定义**: - **进程**:操作系统中的最小运行单位,每个进程都有独立的内存空间。 - **线程**:进程内的执行序列,是调度和执行的基本单位。 - **...