You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Executors创建的ExecutorService实例为何可调用execute()方法

问题描述

请不要关闭本问题,它与「What does it mean to "program to an interface"?」问题无关。
我正在学习ExecutorService接口及其相关方法,通过Executors类的静态方法newFixedThreadPool()创建了ExecutorService类型的对象,尝试调用ExecutorService接口的execute()方法,测试代码如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class WorkerThread implements Runnable {
    private String message;

    public WorkerThread(String s) {
        this.message = s;
    }

    public void run() {
        System.out.println(Thread.currentThread().getName() + " (Start) message = " + message);

        System.out.println(Thread.currentThread().getName() + " (End)");// prints thread name
    }

}

public class TestThreadPool {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);// creating a pool of 5 threads
        for (int i = 0; i < 10; i++) {
            Runnable worker = new WorkerThread("" + i);
            executor.execute(worker);// calling execute method of ExecutorService
        }
        
        executor.shutdown();
        while (!executor.isTerminated()) {
        }

        System.out.println("Finished all threads");
    }
}

上述代码中,我通过Executors类的newFixedThreadPool方法创建了包含5个线程的线程池,得到ExecutorService类型的实例对象。
但我存在疑问:ExecutorService是接口,其中的execute()是抽象方法,同时Executors类本身也没有实现execute()方法,那么此处的executor实例为什么可以调用execute()方法?


解答

这个是Java多态特性和静态工厂设计模式的常规用法,核心逻辑很简单:

  • 接口本身无法实例化,你拿到的ExecutorService变量实际指向的是它的实现类实例
    Executors.newFixedThreadPool()属于静态工厂方法,它不可能返回ExecutorService接口本身的实例——Java中接口没有构造方法,根本没法直接实例化。这个方法内部会构造一个ThreadPoolExecutor类的对象返回,而ThreadPoolExecutor是完全实现了ExecutorService接口所有抽象方法的具体实现类,execute()、shutdown()这些方法的具体逻辑都在这个类里写好了。
  • 父接口类型引用可以指向子类实现类实例,调用方法时会动态绑定到实现类的逻辑
    你用ExecutorService类型的变量接收返回的ThreadPoolExecutor实例,属于Java里的向上转型,运行时调用方法会优先调度实际对象的重写方法。你调用executor.execute()的时候,实际执行的是ThreadPoolExecutor类里的execute()实现逻辑,自然可以正常运行不会报错。
  • Executors是工具类,不需要实现ExecutorService的方法
    Executors本身只是用于创建线程池实例的工具类,不需要实现ExecutorService接口,它的作用只是帮你屏蔽创建ThreadPoolExecutor的复杂参数配置,直接返回符合ExecutorService规范的实现类实例,使用者只需要面向ExecutorService接口的方法编程即可,不需要关心底层用的是哪个实现类、具体逻辑怎么实现。

内容的提问来源于stack exchange,提问作者Mayank Kumar Thakur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:15:04