Java 线程池

简介: Java 线程池

为什么使用线程池?

  1. 背景:经常创建和销毁,使用量特别大的资源,比如并发情况下的线程,对性能影响很大
  2. 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中,可以避免频繁创建销毁,实现重复利用,类似于生活中的单车
  3. 好处:
  1. 提高响应速度(减少了创建新线程的时间)
  2. 降低资源消耗(重复利用线程池中的线程,不需要每次都创建)
  3. 便于线程管理
  1. corePoolSize:核心池的大小
  2. maxmumPoolSize:最大线程数
  3. keepAliveTime:线程没有任务时最多保持多长时间后终止

如何使用线程池

JDK5.0起提供了线程池相关API:ExecutorService和Executor

  1. ExecutorService:真正的线程池接口:常见子类ThreadPoolExecutor
  1. Void execute(Runnable command):执行任务/命令,没有返回值,一般用来执行Runnable
  2. <T>Future<T> submit(Callable<T>task):执行任务,有返回值,一般又来执行Callable
  3. Void shutdown():关闭线程池
  1. Executor:工具类,线程池的工厂类,用于创建并返回不同类型的线程池

ExecutorService 也属于JUC(并发)下的


//newFixedThreadPool参数为线程池大小

ExecutorService executorService= Executors.newFixedThreadPool(10);


image.png


一般线程池使用步骤

  1. 创建服务,创建线程池   newFixedThreadPool(10);
  2. 建完线程池把线程丢进去 执行runnable接口的实现类   execute(new ThreadPool());
  3. 关闭连接   shutdown();


package com.wyh.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * @program: Thread
 * @description: 测试线程池
 * @author: 魏一鹤
 * @createDate: 2022-01-22 21:08
 **/
public class TestThreadPool {
public static void main(String[] args){
//1 创建服务,创建线程池
        //newFixedThreadPool参数为线程池大小
        ExecutorService executorService= Executors.newFixedThreadPool(10);
//2 创建完线程池把线程丢进去 执行runnable接口的实现类
        executorService.execute(new ThreadPool());
        executorService.execute(new ThreadPool());
        executorService.execute(new ThreadPool());
        executorService.execute(new ThreadPool());
        executorService.execute(new ThreadPool());
//3 关闭连接
        executorService.shutdown();
    }
}
class ThreadPool implements  Runnable{
    @Override
public void run() {
            System.out.println(Thread.currentThread().getName());
    }
}


Java通过Executors提供三种线程池,分别为:

  1. newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  3. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

线程池核心参数

  1. corePoolSize(核心线程数)

(1)核心线程会一直存在,即使没有任务执行;

(2)当线程数小于核心线程数的时候,即使有空闲线程,也会一直创建线程直到达到核心线数;

(3)设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。

  1. queueCapacity(任务队列容量)

也叫阻塞队列,当核心线程都在运行,此时再有任务进来,会进入任务队列,排队等待线程执行。

  1. maxPoolSize(最大线程数)

(1)线程池里允许存在的最大线程数量;

(2)当任务队列已满,且线程数量大于等于核心线程数时,会创建新的线程执行任务;

(3)线程池里允许存在的最大线程数量。当任务队列已满,且线程数量大于等于核心线程数时,会创建新的线程执行任务。

  1. keepAliveTime(线程空闲时间)

(1)当线程空闲时间达到keepAliveTime时,线程会退出(关闭),直到线程数等于核心线程数;

(2)如果设置了allowCoreThreadTimeout=true,则线程会退出直到线程数等于零

  1. allowCoreThreadTimeout(允许核心线程超时)
  2. rejectedExecutionHandler(任务拒绝处理器)

(1)当线程数量达到最大线程数,且任务队列已满时,会拒绝任务;

(2)调用线程池shutdown()方法后,会等待执行完线程池的任务之后,再shutdown()。如果在调用了shutdown()方法和线程池真正shutdown()之间提交任务,会拒绝新任务。

线程池参数默认值

corePoolSize = 1

queueCapacity = Integer.MAX_VALUE

maxPoolSize = Integer.MAX_VALUE

keepAliveTime = 60秒

allowCoreThreadTimeout = false

rejectedExecutionHandler = AbortPolicy()

目录
相关文章
|
2月前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
15天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
70 17
|
5月前
|
Java 调度 数据库
Java并发编程:深入理解线程池
在Java并发编程的海洋中,线程池是一艘强大的船,它不仅提高了性能,还简化了代码结构。本文将带你潜入线程池的深海,探索其核心组件、工作原理及如何高效利用线程池来优化你的并发应用。
|
5月前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
151 1
|
2月前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
229 64
|
5月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
5月前
|
存储 监控 安全
一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这篇文章是Java面试第三天的笔记,讨论了线程安全、Thread与Runnable的区别、守护线程、ThreadLocal原理及内存泄漏问题、并发并行串行的概念、并发三大特性、线程池的使用原因和解释、线程池处理流程,以及线程池中阻塞队列的作用和设计考虑。
|
1月前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
1月前
|
监控 Java 开发者
深入理解Java中的线程池实现原理及其性能优化####
本文旨在揭示Java中线程池的核心工作机制,通过剖析其背后的设计思想与实现细节,为读者提供一份详尽的线程池性能优化指南。不同于传统的技术教程,本文将采用一种互动式探索的方式,带领大家从理论到实践,逐步揭开线程池高效管理线程资源的奥秘。无论你是Java并发编程的初学者,还是寻求性能调优技巧的资深开发者,都能在本文中找到有价值的内容。 ####
|
2月前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
126 38