线程池是什么?

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。

线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

为什么用线程池?

为什么要使用线程池,也就是线程池的出现解决了什么样的问题。对此,我曾经看到Neal Gafter的访谈里有这么一段谈话:

说说你对线程池的了解(一) —— 初识线程池_java

我们都知道创建/销毁线程总伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率;而线程池会直接创建好一些线程并缓存在线程池里,后面来了请求就从连接池中取出一个线程处理请求,从而很好的提高了效率。那么线程池的存在仅仅是解决了效率的问题么?这段话给出了另外一个思路:当线程并发数量过多时,抢占系统资源会导致阻塞,甚至还可能导致内存溢出;而我们使用java线程池的话,线程数量一定会<=maximumPoolSize(线程池的最大线程数),所以设置合理的话就不会造成内存溢出。

Executor类的继承结构

说说你对线程池的了解(一) —— 初识线程池_java_02

Executor是线程池的顶级接口,只有一个执行任务的方法execute()。ExecutorService是Executor的子接口,该接口中包含了线程池常用的一些方法。

ThreadPoolExecutor是ExecutorService的默认实现,同时也是Executor的底层实现。

我们常说的线程池必须先从ThreadPoolExecutor说起。

说说你对线程池的了解(一) —— 初识线程池_java_03