线程池有两个主要作用:
- 提高性能。线程的创建和销毁来及开销,线程池复用已有线程,降低开销。
- 控制并发数量。线程池可以限制最大线程数量,避免由于创建过多线程而导致的资源竞争。
使用线程池需要以下步骤:
- 创建线程池。可以使用 Executors 提供的静态方法创建,比如:
ExecutorService pool = Executors.newFixedThreadPool(5);
这里创建了一个大小固定为5的线程池。
- 提交任务。使用 submit() 方法提交 Runnable 或 Callable 实现的任务:
Future<?> future = pool.submit(new Runnable() {...});
- 关闭线程池。使用 shutdown() 关闭,已提交的任务会执行完成:
pool.shutdown();
为什么不使用 JDK 提供的线程池?
主要是 JDK 线程池具有以下缺点:
- 不易自定义参数,如线程数量、名称等
- submit() 方法没有集中的异常处理
- 缺乏生命周期管理,无法优雅地关闭
自定义线程池可以解决这些问题,更加灵活。