线程池
线程池可以简单理解为存放多个线程的一段空间。
线程池的作用是把线程提前创建好,放入线程池中,需要线程时从线程池中取,线程用完归还到线程池中。这样就可以减少线程创建的开销。
一个操作系统包含内核和以及其它计算机系统所必须的组件, 而内核中包含了操作系统的各种核心功能:管理硬件设备,给软件提供稳定的运行环境。 而在计算机中认为有一段代码在应用程序中完成,执行过程是可控的,而在内核中完成的过程是不可控的。而可控的操作比不可控更加高效。
直接创建线程比从线程池拿线程开销小的原因:
- 直接创建线程,需要内核配合完成,是不可控的;
- 先创建好在从线程池中去取,取线程就是可控的操作。
Java 标准库中提供的类 ThreadPoolExecutor 就是创建线程池的类。
构造方法讲解
构造方法
在 ThreadPoolExecutor 类中主要提供了下面四种不同参数的构造方法。我们讲解第四种 7 种参数版本中每个参数代表什么。
corePoolSize 和 maximumPoolSize
int corePoolSize 代表核心线程数的个数。核心线程随着线程池的创建而创建,销毁而销毁。
int maximumPoolSize 代表最大线程数。就是核心线程数与非核心线程数之和。非核心线程是自适应创建的,不繁忙的时候就销毁,繁忙的时候在创建。
KeepAliveTime 和 unit
long KeepAliveTime 代表非核心线程允许空闲的最大时间。
TimeUnit unit 代表时间单位。TimeUnit 是一个枚举类。
workQueue
BlockingQueue<Runnable> workQueue 代表工作队列,也是一个阻塞队列。线程池本身就是一个生产者消费者模型,调用 submit 方法就是在生产,线程池中的线程就是消费者。
threadFactory
ThreadFactory threadFactory 给线程 Thread 类提供的工厂类。ThreadFactory 是一个接口。
并不能直接出来一个对象,需要我们自己创建类实现该接口。
也可以使用 Java 中自带的默认的方式 Executors 类下的 defaultThreadFactory 方法:Executors.defaultThreadFactory();
工厂模式:工厂模式就是主要用来弥补构造方法的缺陷的一种设计模式。当构造方法因为重载限制时,可以当前类中使用 static 静态方法(这个静态方法也称为工厂方法)或者单独使用一个类提供静态方法(这个类称为工厂类),在静态方法中调用构造方法。
例子:我们表示一个点的坐标有使用(x,y)坐标系的方法和(ρ,θ)来表示。 像下面这样提供构造方法就会报错。
但是我们像下面这样提供一个工厂类就可以避免了。
class Point {
double x;
double y;
double ρ;
double θ;
}
class PointFactory {
public static void {
();
point.x = x;
point.y = y;
}
{
();
point.ρ = ρ;
point.θ = θ;
}
}


