北京怀柔做网站管理运营的公司,杭州关键词推广优化方案,企业网络推广计划,十堰网络公司排名对象池模式#xff0c;Object Pool Pattern#xff0c;当你的应用程序需要频繁创建和销毁某种资源#xff08;比如数据库连接、线程、socket连接等#xff09;时#xff0c;Object Pool 设计模式就变得很有用。它通过预先创建一组对象并将它们保存在池中#xff0c;以便在…对象池模式Object Pool Pattern当你的应用程序需要频繁创建和销毁某种资源比如数据库连接、线程、socket连接等时Object Pool 设计模式就变得很有用。它通过预先创建一组对象并将它们保存在池中以便在需要时重复使用从而避免了频繁的创建和销毁操作提高了性能和资源利用率换言之用空间换时间。 类图 Object Pool 模式通常由以下几个组件组成
1. 对象池Object Pool 它是一个保存对象实例的集合这些对象在需要时被获取并在不再需要时被释放。对象池还会跟踪哪些对象当前正在被使用哪些是可用的。对象池分三层分别是 ObjectPool, AbstractObjectPool, ConcreteObjectPool.
2. 对象工厂Object Factory 负责创建对象实例并将它们添加到对象池中。当池中没有可用对象时工厂可能会创建新的对象但通常是预先创建一组对象并初始化它们。对象工厂分两层分别是ObjectFactory和ConcreteObjectFactory.
3. 池化对象Poolable Object 存在于对象池中的对象实例。池化对象也分两层分别是PoolableObject和ConcretePoolableObject. Object Pool 的优点包括
性能提升避免了频繁的创建和销毁对象减少了系统开销。资源利用率提高通过重用对象实例减少了资源的浪费。减少竞争在多线程环境下对象池可以减少线程之间对资源的竞争提高了并发性能。
但是Object Pool 也可能存在一些缺点比如可能会增加代码的复杂性特别是在处理对象状态和资源管理方面。此外如果对象的创建和销毁开销相对较小使用对象池可能会产生额外的开销。因此在使用 Object Pool 模式时需要权衡利弊。
示例
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;public class ThreadPool {private BlockingQueueRunnable taskQueue;private Thread[] pool;public ThreadPool(int poolSize, int taskQueueSize) {taskQueue new LinkedBlockingQueue(taskQueueSize);pool new Thread[poolSize];for (int i 0; i poolSize; i) {pool[i] new Worker(Thread- i);pool[i].start();}}public void submit(Runnable task) throws InterruptedException {taskQueue.put(task);}private class Worker extends Thread {public Worker(String name) {super(name);}Overridepublic void run() {while (true) {try {Runnable task taskQueue.take();task.run();} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}}}}public static void main(String[] args) {// 创建一个线程池包含3个线程任务队列容量为5ThreadPool threadPool new ThreadPool(3, 5);// 提交10个任务到线程池for (int i 0; i 10; i) {int taskId i;try {threadPool.submit(() - {System.out.println(Task taskId is running on Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行时间} catch (InterruptedException e) {e.printStackTrace();}});} catch (InterruptedException e) {e.printStackTrace();}}}
}运行结果
Task 0 is running on Thread-0 Task 2 is running on Thread-2 Task 1 is running on Thread-1 Task 5 is running on Thread-0 Task 4 is running on Thread-2 Task 3 is running on Thread-1 Task 8 is running on Thread-1 Task 6 is running on Thread-0 Task 7 is running on Thread-2 Task 9 is running on Thread-2 结论
可见同一时间只有3个线程在工作直到将10个任务全部完成。