ThreadPoolExecutorService串行执行?线程内启动线程如何实现并发?
用ExecutorService实现线程内的并发任务提交
看起来你是在嵌套线程场景下遇到了意外阻塞的问题——核心原因大概率是之前手动创建线程时,不小心引入了同步等待逻辑(比如调用了join()),而用ExecutorService的线程池来统一管理任务,就能让宿主线程提交新任务后立刻继续执行,和从原始类提交线程的效果完全一致。
步骤1:创建合适的ExecutorService线程池
首先你需要一个全局(或在可访问范围内)的线程池实例,根据任务特性选择对应类型:
- 若任务数量固定且耗时较长,选
newFixedThreadPool - 若为大量短任务,用
newCachedThreadPool(自动复用空闲线程) - 单线程池
newSingleThreadExecutor不满足并发需求,请勿使用
示例代码:
// 定义为类成员变量,确保所有线程都能访问到 private ExecutorService taskExecutor = Executors.newFixedThreadPool(4); // 4线程固定池
步骤2:在宿主线程内提交任务实现并发
在内部线程的run()方法里,直接把新任务提交给线程池即可——提交操作是立即返回的,宿主线程会继续执行自身逻辑,新任务会在线程池的空闲线程中并行运行。
示例代码:
// 这是你的宿主线程的run方法 @Override public void run() { // 宿主线程原有业务逻辑 System.out.println("[" + Thread.currentThread().getName() + "] 宿主线程开始执行"); // 提交新任务到线程池,无需等待 taskExecutor.submit(() -> { // 新任务业务逻辑 System.out.println("[" + Thread.currentThread().getName() + "] 新任务启动"); try { // 模拟耗时操作 Thread.sleep(3000); } catch (InterruptedException e) { // 正确处理中断,恢复中断状态 Thread.currentThread().interrupt(); System.err.println("新任务被中断"); } System.out.println("[" + Thread.currentThread().getName() + "] 新任务执行完成"); }); // 宿主线程继续执行后续逻辑,不会等待新任务 System.out.println("[" + Thread.currentThread().getName() + "] 宿主线程继续执行后续代码"); }
步骤3:正确关闭线程池
线程池不会自动关闭,在所有任务完成后(比如程序退出前),需要手动关闭避免资源泄漏:
// 在程序结束或所有任务提交完成后调用 public void shutdownExecutor() { taskExecutor.shutdown(); // 停止接受新任务,等待已提交任务完成 try { // 等待60秒让所有任务完成 if (!taskExecutor.awaitTermination(60, TimeUnit.SECONDS)) { // 超时则强制中断所有任务 taskExecutor.shutdownNow(); // 再等60秒确认终止 if (!taskExecutor.awaitTermination(60, TimeUnit.SECONDS)) { System.err.println("线程池无法正常终止"); } } } catch (InterruptedException e) { // 捕获中断,强制关闭线程池 taskExecutor.shutdownNow(); // 恢复当前线程的中断状态 Thread.currentThread().interrupt(); } }
避坑提醒
- 不要在提交任务后立刻调用
Future.get():如果用submit()返回的Future对象调用get(),会阻塞当前线程直到新任务完成,这会回到你之前的问题。只有确实需要新任务执行结果时才调用它。 - 不要在线程内部创建新线程池:尽量复用全局线程池,避免创建过多线程导致资源耗尽。
- 正确处理中断异常:任务中的
InterruptedException要恢复线程中断状态,避免后续逻辑忽略中断信号。
这样一来,不管是从原始类提交任务,还是从线程内部提交任务,都是交给同一个线程池管理,宿主线程都能和新任务并发执行,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Joss MT
相关产品推荐
相关产品推荐

