十一、线程池

线程池

1. 背景

  • 创建/销毁线程需要消耗系统资源,线程池可以复用已创建的线程
  • 控制并发的数量,并发数量过多可能会导致资源大量消耗而造成崩溃
  • 可以对线程做统一管理

2. 思路

​ 提前创建好多个线程并放入线程池中,使用时直接获取,用完再放回池中。这样可以避免频繁的创建销毁、实现重复利用。类似生活中的公交工具。

3. 好处

  • 提高相应速度,减少了创建新线程的时间
  • 降低资源消耗,重复利用线程池中线程,不需要每次都创建
  • 便于线程管理
    • corePoolSize:核心线程数最大值
    • maximumPoolSize:最大线程数
    • keepAliveTime:非核心线程没有任务时最多保持多长时间
    • unitkeepAliveTime的单位
    • workQueue:阻塞队列,维护着等待执行的Runnable对象

4. 使用

  • JDK5 后提供了线程池相关 API:ExecutorServiceExecutors
  • ExecutorService:真正的线程池接口,常见子类为ThreadPoolExecutor
    • void execute(Runnable command):执行任务,没有返回值,一般用来执行Runnable
    • <T> Future<T> submit(Callable<T> task):执行任务,有返回值,一般用来执行Callable
    • void shutdown():关闭连接池
  • Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池
例:
public class TestPool {
    public static void main(String[] args) {
        // 1. 创建服务,创建线程池
        // newFixedThreadPool 参数为线程池大小
        ExecutorService service = Executors.newFixedThreadPool(10);
        // 执行
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());
        // 2. 关闭连接
        service.shutdown();
    }
}

class MyThread implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}
上一篇:多线程05/线程的创建和启动2:实现Runnable接口


下一篇:创建线程的两种方式