首页 > 编程语言 >【设计模式】工厂方法模式——工厂方法模式在JDK源码中的应用

【设计模式】工厂方法模式——工厂方法模式在JDK源码中的应用

时间:2024-01-12 10:00:57浏览次数:25  
标签:Thread Executors ThreadFactory 工厂 源码 new 设计模式 public

工厂方法模式在JDK源码中有很多应用场景,不仅有简单工厂模式,还有多工厂模式。


Executors

尽管ThreadPoolExecutor及其子类都是可以直接new出来的,但Executors还是提供了生产常用ThreadPoolExecutor实例的简单工厂:

public class Executors {

    /**
     * Creates a thread pool that reuses a fixed number of threads
     */
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
    }

    /**
     * Creates an Executor that uses a single worker thread operating
     */
    public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>(),
                                    threadFactory));
    }

    /**
     * Creates a thread pool that creates new threads as needed, but
     */
    public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>(),
                                      threadFactory);
    }

    /**
     * The default thread factory.
     */
    private static class DefaultThreadFactory implements ThreadFactory {
        private static final AtomicInteger poolNumber = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;

        DefaultThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                                  Thread.currentThread().getThreadGroup();
            namePrefix = "pool-" +
                          poolNumber.getAndIncrement() +
                         "-thread-";
        }

        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r,
                                  namePrefix + threadNumber.getAndIncrement(),
                                  0);
            if (t.isDaemon())
                t.setDaemon(false);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
    }

    /** Cannot instantiate. */
    private Executors() {}
}

可以看到newFixedThreadPool()是用来生产适合CPU密集场景的定长线程池的工厂方法、newCachedThreadPool()是用来生产适合IO密集场景的可缓存线程池的工厂方法、newSingleThreadExecutor()则是用来生产单线程模型下偶尔需要异步操作的单线程线程池的工厂方法(在Android场景下被IntentService代替),这是典型的简单工厂模式。

Executors的代码里用到了简单工厂模式,是否也用到了多工厂模式呢?答案是肯定的,注意静态内部类DefaultThreadFactory的父类ThreadFactory,就是典型的多工厂模式。


ThreadFactory

ThreadFactory用来生成Thread的实例,代码如下:

public interface ThreadFactory {
    Thread newThread(Runnable r);
}

可见ThreadFactory是仅有一个方法的接口,具体实现都是子类做的,除了上文提到的Executors.DefaultThreadFactory以外,还有CompletableFuture.Delayer.DaemonThreadFactory、CleanerImpl.InnocuousThreadFactory和Android的NamedThreadFactory等子类。




标签:Thread,Executors,ThreadFactory,工厂,源码,new,设计模式,public
From: https://blog.51cto.com/dongfeng9ge/9210764

相关文章

  • PHP+uniapp进销存源码|erp源码计算机毕业设计[附源码]
     企业资源规划(ERP)是一种软件系统,可帮助组织自动化和管理核心业务流程以获得最佳性能。ERP软件协调公司业务流程之间的数据流,提供单一事实来源并简化整个企业的运营。它能够将公司的财务、供应链、运营、商业、报告、制造和人力资源活动连接到一个平台上。 大多数公司都......
  • [转帖]从Linux源码看TIME_WAIT状态的持续时间
    https://zhuanlan.zhihu.com/p/286537295 从Linux源码看TIME_WAIT状态的持续时间前言笔者一直以为在Linux下TIME_WAIT状态的Socket持续状态是60s左右。线上实际却存在TIME_WAIT超过100s的Socket。由于这牵涉到最近出现的一个复杂Bug的分析。所以,笔者就去Linux源码里面,......
  • Python实现软件设计模式8:桥接模式 Bridge Pattern
    动机将抽象部分与实现部分分离,使他们都可以独立地变化。用抽象关联取代传统的多层继承。将类之间的静态继承关系转换为动态的对象组合关系。上图展示的软件系统中存在两个独立地变化维度,分别是抽象类(Abstraction)和实现类(Implementor),它俩都是接口、都分别可以独立地扩展出多......
  • Python实现软件设计模式7:适配器模式 Adapter Pattern
    动机有两个不存在直接继承或关联关系的类A、B,A希望能利用到B类中某个已存在的、功能完善的方法,而不再去具体实现A的接口源码;适配器模式使接口不兼容的那些类可以一起工作。主要角色目标类Target抽象接口类适配者Adaptee适配器Adapter具体实现接口客户端C......
  • 药品不良反应智能监测系统源码
    java药品不良反应智能监测系统系统概述:   基于AI技术和深度学习模型,系统构建ADR智能识别模型,实现病程记录分析,提取病程记录实体,并完成语义关系的分类识别。一方面可以根据医务人员设置的监测任务或主题,如科室、人群、药品、ADR等,对ADR事件进行智能监测;另一方面也可以根据不良......
  • 基于微信小程序的毕业设计-图书推荐系统(附源码+论文)
    了解设计+图片上号摘要:随着互联网的普及和信息技术的发展,图书推荐管理系统在图书馆中发挥着越来越重要的作用。本文基于SpringBoot框架,设计并实现了一个图书推荐管理系统。该系统能够根据用户的历史阅读记录和兴趣,为其推荐合适的图书,提高图书馆的借阅率。关键词:微信小程序;图书推荐;......
  • 【设计模式】模板方法模式——模板方法模式在JDK源码中的应用
    模板方法模式在JDK源码里最典型的实现就是AQSAbstractQueuedSynchronizerAQS(AbstractQueuedSynchronizer)的部分代码如下:publicabstractclassAbstractQueuedSynchronizerextendsAbstractOwnableSynchronizerimplementsjava.io.Serializable{//……代码......
  • ? 开源即时通讯(IM)项目OpenIM源码部署指南
    OpenIM的部署涉及多个组件,并支持多种方式,包括源码、Docker和Kubernetes等。这要求在确保不同部署方式之间的兼容性同时,还需有效管理各版本之间的差异。确实,这些都是复杂的问题,涉及到深入的技术细节和精准的系统配置。我们的目标是简化部署流程,同时保持系统的灵活性和稳定性,以适应不......
  • PyTorch项目源码学习(2)——Tensor代码结构初步学习
    PyTorch版本:1.10.0TensorTensor是Pytorch项目较为重要的一部分,其中的主要功能如存储,运算由C++和CUDA实现,本文主要从前端开始探索学习Tensor的代码结构。结构探索PyTorch前端位于torch目录下,从_tensor.py可以找到Tensor的python定义,可以看到其继承自torch._C._Tensorbase而Te......
  • C++设计模式05 —— 装饰模式
    装饰模式过度的使用继承使得派生的子类过多,代码重复度很高,复用性变差。实现加密文件流、加密网络流、加密内存流、缓冲文件流、缓冲网络流、缓冲内存流。如果我们创建一个流基类,然后创建文件流继承流基类,最后创建加密文件流继承文件流、创建缓冲文件流继承文件流。如果这......