多态不直接实现多线程调度,但为统一管理与灵活扩展提供设计基础:通过Runnable/Callable接口或抽象任务类,使不同业务任务能被线程池或Thread统一调度,依赖父类型引用调用重写方法实现运行时分派。

多态本身不直接“实现”多线程调度,但它为多线程任务的统一管理与灵活扩展提供了关键设计基础。核心在于:用统一的接口或父类类型声明任务,让不同具体任务对象(如不同业务逻辑)能被同一线程执行机制(如线程池、Thread 构造器)接收和运行。
用 Runnable/Callable 接口体现多态
Runnable 和 Callable 是典型的函数式接口,天然支持多态。多个业务类只要实现同一个接口,就可被统一提交给线程执行器:
- 定义一个 Runnable 接口变量,可以指向任意实现了它的类实例(如 OrderProcessor、LogUploader、DataValidator)
- 创建 Thread 对象时传入该变量:
new Thread(task).start(),JVM 不关心 task 具体是哪个类,只调用其run()方法 - 使用线程池时更明显:
executor.submit(task)—— 无论 task 是支付任务还是通知任务,都走同一套调度流程
通过抽象任务类统一调度入口
可定义抽象基类(如 AbstractTask),封装共性逻辑(日志、异常捕获、耗时统计),再让各类业务任务继承它:
- 子类重写抽象方法
doExecute(),实现差异化逻辑 - 基类的
run()方法统一调用doExecute()并处理前后置动作 - 线程启动时仍用
new Thread(new PaymentTask()).start(),但实际执行的是多态分派后的子类方法
在线程池中发挥多态优势
ExecutorService 是最典型的多态调度场景:
立即学习“Java免费学习笔记(深入)”;
- 提交任务时,
submit(Runnable task)或submit(Callable<t> task)</t>的参数类型是接口,不是具体类 - 你可以随时新增一个
ReportGenerator implements Callable<string></string>,无需修改线程池代码,直接submit(new ReportGenerator()) - Future.get() 获取结果时,也不依赖具体类型——返回值由泛型
Callable声明决定,编译期即安全
注意避免多态失效的常见陷阱
多态要起作用,必须通过“父类型引用指向子类型对象”,并调用“被重写的方法”:
-
错误做法:直接调用
task.run()(非 start),这仅是普通方法调用,不开启新线程,也失去调度意义 -
错误做法:在子类中重载(overload)
run()而非重写(override),会导致父类 run 执行空逻辑 -
关键点:线程调度依赖 JVM 对
start()的底层处理,而最终执行内容由多态决定的run()或call()提供



















