一、概述

1、介绍

  在使用线程时,需要new一个,用完了又要销毁,这样频繁的创建和销毁很耗资源,所以就提供了线程池。道理和连接池差不多,连接池是为了避免频繁的创建和释放连接,所以在连
接池中就有一定数量的连接,要用时从连接池拿出,用完归还给连接池,线程池也一样。
  线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。

  脑图:https://www.processon.com/view/link/61849ba4f346fb2ecc4546e5

聊聊并发(五)——线程池-LMLPHP

2、简单使用

  线程池用法很简单, 分为三步。首先用工具类Executors创建线程池,然后给线程池分配任务,最后关闭线程池就行了。

 1 public class ThreadPoolTest {
 2     public static void main(String[] args) throws Exception {
 3
 4         // 1.创建一个 10 个线程数的线程池
 5         ExecutorService service = Executors.newFixedThreadPool(10);
 6
 7         // 2.执行一个Runnable
 8         service.execute(new Number1());
 9
10         // 2.提交一个Callable
11         Future<Integer> future = service.submit(new Number2());
12         Integer integer = future.get();
13         System.out.println("result = " + integer);
14
15         // 关闭线程池
16         service.shutdown();
17     }
18 }
19
20 class Number1 implements Runnable {
21
22     @Override
23     public void run() {
24         System.out.println("----打印Runnable----");
25     }
26 }
27
28 // 10以内数求和
29 class Number2 implements Callable<Integer> {
30     private int sum = 0;
31
32     @Override
33     public Integer call() {
34         for (int i = 0; i <= 10; i++) {
35             if (i % 2 == 0) {
36                 sum += i;
37             }
38         }
39         return sum;
40     }
41 }
11-18 15:45