使用 executors.newsinglethreadexecutor() 可以创建一个单线程的线程池,它保证任务按提交顺序执行且同一时刻只有一个任务在运行。具体做法是调用该工厂方法获取 executorservice 实例,然后调用 submit() 或 execute() 提交任务,最后必须调用 shutdown() 来优雅地关闭线程池。

如何提交并等待单个任务完成
要提交一个任务并获取其执行结果,应使用 submit() 方法,它会返回一个 Future 对象。通过调用 Future.get() 可以阻塞当前线程直到任务完成并获取返回值,如果任务抛出异常,这里会包装成 ExecutionException 抛出。

import java.util.concurrent.*;
public class Demo {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<string> future = executor.submit(() -> {
Thread.sleep(1000);
return "Done";
});
System.out.println(future.get());
executor.shutdown();
}
}</string>
如何处理任务执行中的异常
当任务在执行过程中抛出未捕获的异常时,submit() 不会让异常直接传播到主线程,而是将其封装在 Future.get() 抛出的 ExecutionException 中。开发者需要捕获这个异常并提取原始的 Cause 进行处理,否则异常会被静默吞没。

import java.util.concurrent.*;
public class Demo {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<void> future = executor.submit(() -> {
throw new RuntimeException("Error");
});
try {
future.get();
} catch (ExecutionException e) {
System.out.println(e.getCause().getMessage());
}
executor.shutdown();
}
}</void>
线程池关闭后提交新任务会发生什么
如果在调用 shutdown() 之后再次尝试向线程池提交任务,线程池将拒绝该任务并抛出 RejectedExecutionException。这是因为 shutdown() 会阻止新任务的提交,同时等待已提交的任务执行完毕。这是防止资源泄漏和状态混乱的关键步骤。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











