传统多线程方案中,一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出。这就是即时创建,即时销毁的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务执行时间很短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态。
t1: 线程创建时间
t2: 线程执行时间,包括线程的同步等时间
t3: 线程销毁时间
线程本身的开销所占的比例为(t1+t3)/(t1+t2+t3)。如果线程执行的时间很短,这笔开销可能占到20%~50%左右。如果任务执行很频繁的话,这笔开销将是不可忽略的。
所以引发了线程池的使用,初始化时就创建一个线程池,里面已经开好了线程。
定长线程池就是池子里线程数是固定的,任务排队轮流使用,实例如下
public static void main(String[] args) throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(5); //execute submit
for (int i = 0; i < 6; i++) {
service.execute(() -> {
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出当前线程名称
System.out.println(Thread.currentThread().getName());
});
}
}
可以看出第六个任务没有立即执行,而是等待有线程空出来之后才会执行。