前言
本文介绍java多线程最不可缺少的一环——线程池。
说到线程池,就不得不提池化思想了。池化思想的核心就是复用。
如果我们不用线程池,而是自己创建Thread对象来运行任务,系统就会不断的创建和回收Thread对象,而这其中必然会造成系统效率的下降和资源的浪费。
但是如果我们提前准备了一些空闲的Thread对象,需要的时候直接拿来用,用完了再把空闲的Thread对象存起来以备下次使用。这样就避免了系统临时创建线程和回收线程所产生的资源浪费。
这就是线程池的由来。
本文会从学习线程池所需要的前置知识入手,继而通过解剖线程池的内部结构和工作原理,来带动学习如何具体使用线程池。最后还会根据所学知识分析JDK提供的几种具体的线程池的特点。
线程池的前置知识
要讲线程池的前置知识,让我们先预支下之后要用到的内容,来看看正常情况下是如何使用线程池的吧:
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newCachedThreadPool();
Future<Integer> future = executor.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return 0;
}
});
future.get(); // 阻塞方法,直到future有结果
}