诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务。构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务。但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大。所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这样就引入了“池”的概念,“池”的概念使得人们可以定制一定量的资源,然后对这些资源进行复用,而不是频繁的创建和销毁。
线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中。这些线程都是处于睡眠状态,即均为启动,不消耗CPU,而只是占用较小的内存空间。当请求到来之后,缓冲池给这次请求分配一个空闲线程,把请求传入此线程中运行,进行处理。当预先创建的线程都处于运行状态,即预制线程不够,线程池可以自由创建一定数量的新线程,用于处理更多的请求。当系统比较闲的时候,也可以通过移除一部分一直处于停用状态的线程。
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。
那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?
在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
个人补充:tomcat处理Http请求也是使用的线程池,如下图所示
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。
ExecutorService |
真正的线程池接口。(接口) |
ScheduledExecutorService |
能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。(接口) |
ThreadPoolExecutor |
ExecutorService的默认实现。(实现) |
ScheduledThreadPoolExecutor |
继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。(实现) |
要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。
1. new SingleThreadExecutor
创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
2.new FixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3. new CachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
4.new ScheduledThreadPool
相关推荐
本篇文章将深入探讨Java对象池的实现原理,以及如何借鉴"Jakarta Commons Pool"组件来设计一个轻量级的对象池。 一、对象池的基本概念 对象池的基本工作流程包括以下几个步骤: 1. 初始化:预创建一定数量的对象并...
### Java对象池技术的原理 在Java开发领域中,对象池技术是一种常用的设计模式,用于管理可重用的对象集合,从而提高系统性能并减少资源消耗。本文将详细探讨Java对象池技术的基本原理及其具体实现方式。 #### ...
### Java对象池技术的原理及其实现 #### 一、对象池的概念与作用 对象池是一种软件设计模式,主要用于管理那些频繁创建与销毁且代价较高的对象。通过预先创建一定数量的对象,并将其保存在一个集合(通常称为池)...
Java对象池是一种优化资源管理的技术,它通过复用已经创建并初始化过的对象,避免了频繁地创建和销毁对象带来的性能开销。在Java中,对象池通常用于数据库连接、线程、Socket等昂贵资源的管理。下面我们将深入探讨...
"Java对象池策略及其性能的研究" Java对象池策略是指当对象池内的对象数量已经达到上限,但有新的对象要加入时,需按照某种算法从对象池选择一个删除,以便添加新的对象。常用的策略有LRU策略、轮询策略和随机策略...
通过上述步骤,我们已经实现了一个基本的Java对象池。然而,这只是一个简化的示例,实际应用中可能需要考虑更多的因素,如对象的公平分配、超时回收、对象状态检查等。例如,Apache Commons Pool2库提供了一套完整的...
BeeOP:轻便的高性能Java对象池MavenartifactId(Java7) < dependency> < groupId>com.github.chris2018998</ groupId> < artifactId>beeop</ artifactId> < version>0.7</ version></ dependency>表现一百万次...
基于Java的对象池管理系统 项目简介 本项目是一个基于Java的对象池管理系统,旨在通过对象池技术减少频繁创建和销毁对象所带来的开销,从而提高系统性能和资源利用率。对象池技术允许在需要时从池中获取已存在的...
在计算机科学和编程领域,对象池是一种内存管理策略,它预先创建并维护一组对象,以供重复使用,而不是每次需要时都创建新对象。这种方式可以显著提高程序性能,特别是对于那些生命周期短暂但创建成本较高的对象。...
本资源包含两部分:工厂设计模式和对象池的设计与实现,主要面向Java开发者。 首先,我们来深入理解工厂设计模式。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需暴露创建逻辑,同时允许...
这是一个很简单的实现啦对象池与线程池的融合,方法的主要参数,线程池大小、对象池大小、对象的创建工厂(继承接口自己实现),执行时传入方面名称即可。(invoke方法第一个为参数为方法名,第二是可变参数(及方法...
- **Stack**:使用Java的Stack类作为对象池,它是一个基于链表的后进先出(LIFO)数据结构,非常适合用于对象池,因为获取和归还对象的操作都与栈操作类似。 - **initalPool**:初始化对象池的方法,根据配置参数`...
Stormpot是Java的对象池库。 用它来回收创建成本很高的对象。 该库将负责在后台创建和销毁您的对象。 Stormpot非常成熟,已在生产中使用,并且已经在测试中完成了数百万亿[ ]个声明发布周期。 它比任何竞争池都更...
对象池模式是一种设计模式,它在Java编程中用于管理和重用昂贵资源,如数据库连接、线程或网络套接字,以减少系统性能开销。当频繁创建和销毁这些资源时,对象池模式能显著提高效率。在描述的示例中,我们看到一个...
Java对象池技术是一种优化资源管理的方法,主要用于减少创建和销毁对象的开销,尤其是在频繁创建和销毁对象的应用场景中。其基本思想是预先创建并维护一组可重用的对象,当程序需要一个对象时,可以从池中获取,而...
本文将详细探讨Java对象在JVM中的创建过程以及其内存布局,帮助读者更深入地理解Java对象是如何在内存中产生的。 #### 二、对象的创建 Java对象是由类实例化的结果,当我们使用`new`关键字创建一个对象时,实际上...
这个压缩包包含三个文件:`ObjectPool.java`、`Test.java`和`TestObject.java`,分别代表了对象池的实现、测试类以及一个用于测试的对象类。 `ObjectPool.java` 文件很可能实现了对象池的基本逻辑。它可能包括以下...
在这个问题中,我们关注的是`Integer`类的创建,以及Java对象池机制对性能的影响。让我们深入探讨一下。 首先,`Integer`是Java中的一个包装类,用于封装基本类型`int`。Java提供了八种基本类型的包装类,包括`...
在Java中,`java.util.concurrent`包下的`ObjectPool`接口就是用于定义对象池的行为。通过对象池,可以避免频繁的实例化和垃圾回收,提高程序运行速度。例如,JDBC的`Statement`和`PreparedStatement`对象池,可以...