在实现 Runnable 的多线程任务类中,可用 this 提交自身到线程池,但需确保类已正确实现接口、未提前提交、线程池处于运行状态且避免 this 逸出和重复提交。

在多线程任务类中,若该类自身实现了 Runnable(或 Callable),可直接用 this 表示当前实例,将其提交给线程池——前提是确保该实例尚未被提交或正在运行,且线程池未关闭。
确保类实现 Runnable 接口
只有当类明确实现 Runnable 时,this 才是合法的 Runnable 实例:
- 定义类时需声明
implements Runnable - 重写
run()方法,封装实际执行逻辑 - 避免在构造期间就提交
this,防止 this 引用逸出(尤其在非 final 字段或匿名内部类中)
在线程池中提交 this 的典型方式
在类的某个方法(如初始化后、事件触发时)中调用线程池的 submit() 或 execute():
-
executor.execute(this);—— 适用于 void run() 场景 -
executor.submit(this);—— 返回Future<?>,注意Runnable的submit返回Future<Void> - 若使用
ThreadPoolExecutor,需确保其处于RUNNING状态,否则抛出RejectedExecutionException
避免常见陷阱
this 提交后不代表任务立即执行,也不代表可重复提交(除非逻辑允许):
- 不要在
run()方法内再次提交this,易造成无限递归或资源耗尽 - 若任务含状态(如计数器、标志位),注意多线程并发修改问题,必要时加锁或使用原子变量
- 提交前检查线程池是否
isShutdown()或isTerminated(),防止运行时异常
一个简洁示例
以下是一个安全使用 this 提交的最小可行结构:
class MyTask implements Runnable {<br> private final ExecutorService executor;<br><br> MyTask(ExecutorService executor) {<br> this.executor = executor;<br> }<br><br> void start() {<br> if (!executor.isShutdown()) {<br> executor.execute(this);<br> }<br> }<br><br> @Override<br> public void run() {<br> System.out.println("Task running in thread: " + Thread.currentThread().getName());<br> // 实际业务逻辑<br> }<br>}

















