1、概述

线程池:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

好处:

1. 降低资源消耗。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2. 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
3. 提高线程的可管理性。可以根据系统的承受能力,调整线程池中线程的数目,防止因为消耗过多的内存,而把服务器累趴下

Java里面线程池的顶级接口是java.util.concurrent.Executor,是一个执行线程的工具。

真正的线程池接口是java.util.concurrent.ExecutorService

java.util.concurrent.Executors线程工厂类里面提供了一些静态工厂,生成一些常用的线程池。

官方建议使用Executors工程类来创建线程池对象。

2、创建线程池

Executors类中创建线程池的方法如下:

Executors 线程池执行器类 :
1. newCachedThreadPool(); 缓存数量线程池.
2. newFixedThreadPool(); 固定数量线程池.
3. newSingleThreadExecutor(); 单个可复用线程池对象.

ExecutorService 执行器服务类 :
1. submit(Runnable task); 向线程池对象提交任务.
2. shutdown(); 关闭线程池对象.

API说明:

Java SE多线程部分--22.线程池_创建线程

Java SE多线程部分--22.线程池_java_02

Java SE多线程部分--22.线程池_创建线程_03

演示:

package com.base.blog;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolTest {
    public static void main(String[] args) {

        // 1. 创建要给线程池对象
         ExecutorService threadPool = Executors.newFixedThreadPool(5);
        // ExecutorService threadPool = Executors.newCachedThreadPool();
        //ExecutorService threadPool = Executors.newSingleThreadExecutor();

        // 2. 向线程池对象中提交任务对象
        for (int i = 0; i < 50; i++) {
            threadPool.submit(new Runnable() {
                @Override
                public void run() {
                    // 随机耗时 ...
                    try {
                        Thread.sleep((long)(Math.random() * 500));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    int sum = 0;
                    for (int i = 1; i <= 100; i++) {
                        sum += i;
                    }
                    System.out.println(Thread.currentThread().getName() + " 计算结果 = " + sum);
                }
            });
        }

        // 3. 关闭线程池对象
        threadPool.shutdown();
    }
}

Java SE多线程部分--22.线程池_线程池_04

3、线程生命周期图解:

Java SE多线程部分--22.线程池_java_05