这里两个写法看不出什么,如果是我的话,会将这个 Task 的逻辑,写到具体的 Service 然后 TaskRunner 作为一个中间组件 到这个程度的话: 1. new Thread(() -> XXXService.DoSomething).start(); // 原生线程池,没有特殊处理 2. TaskRunner.Run("doSomething", () -> XXXService.DoSomething); // 中间件封装 为什么中间件封装: 1. 统计,监控,日志 2. 线程数量控制(即便是协程) 3. 以后 TaskRunner 控制复杂调度(优先级,丢弃,限流...) 如果你们是一个成熟的团队,本来就需要这些中间件,在这个基础上,都只是一个简单的方法调用而已