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
相关产品推荐
相关产品推荐

