县区网站集约化平台建设研究,传奇开服网,什么网站可以自己接工程做预算,上海机械网站建设什么是线程池 线程池#xff08;Thread Pool#xff09;是一种用于管理和复用线程的技术#xff0c;它可以在多线程编程中有效地管理线程的创建、执行和销毁。是一种有效管理线程的机制#xff0c;可以提高多线程编程的效率、性能和资源利用率。它在许多并发编程的场景中被…什么是线程池 线程池Thread Pool是一种用于管理和复用线程的技术它可以在多线程编程中有效地管理线程的创建、执行和销毁。是一种有效管理线程的机制可以提高多线程编程的效率、性能和资源利用率。它在许多并发编程的场景中被广泛使用如服务器端程序、并行计算、异步任务等。 线程池的好处包括 提高性能由于线程的创建和销毁是一项耗时的操作使用线程池可以避免频繁地创建和销毁线程提高了程序的性能。 资源管理线程池可以限制线程的数量避免线程过多导致系统资源的浪费和性能下降。 控制并发度通过控制线程池的大小可以限制并发任务的数量避免系统资源过载和响应时间过长的问题。 提供任务排队和调度线程池可以对任务进行排队和调度确保任务按照一定的顺序和优先级执行。 线程池的参数详细介绍 核心线程数corePoolSize核心线程数是线程池中保持活动状态的线程数量。在没有任务执行时核心线程会一直保持存活状态。如果任务数量超过核心线程数线程池会创建新的线程来执行任务。 最大线程数maximumPoolSize最大线程数是线程池中允许存在的最大线程数量。当任务数量超过核心线程数且任务队列已满时线程池会创建新的线程直到达到最大线程数。超过最大线程数的任务会根据配置的拒绝策略进行处理。 空闲线程存活时间keepAliveTime当线程池中的线程数量超过核心线程数时多余的空闲线程会在一定时间内保持活动状态等待新的任务。keepAliveTime 是空闲线程的存活时间超过这个时间线程会被销毁直到线程池的线程数量不超过核心线程数。 时间单位TimeUnit对于核心线程数、最大线程数和空闲线程存活时间通常需要指定一个时间单位如秒、毫秒等。 任务队列workQueue任务队列用于存储待执行的任务。线程池根据任务数量和线程池状态来决定任务的执行方式。常见的任务队列有无界队列和有界队列如 LinkedBlockingQueue 和 ArrayBlockingQueue。 线程工厂threadFactory线程工厂用于创建新的线程实例。通过指定线程工厂可以自定义线程的一些属性如名称、优先级等。 拒绝策略rejectedExecutionHandler当任务数量超过线程池的最大线程数时线程池会对新的任务采取一定的拒绝策略。常见的拒绝策略有直接抛出异常、丢弃任务、丢弃最旧的任务和调用者运行等。 正确地配置线程池参数可以避免线程过多或过少导致的性能问题并提高任务的处理效率和并发度。 若把创建一个线程池想象成开个公司. 每个员工相当于一个线程.则: corePoolSize: 正式员工的数量. (正式员工, 一旦录用, 永不辞退) maximumPoolSize: 正式员工 临时工的数目. (临时工: 一段时间不干活, 就被辞退). keepAliveTime: 临时工允许的空闲时间. unit: keepaliveTime 的时间单位, 是秒, 分钟, 还是其他值. workQueue: 传递任务的阻塞队列 threadFactory: 创建线程的工厂, 参与具体的创建线程工作 RejectedExecutionHandler: 拒绝策略,如果任务量超出公司的负荷了接下来怎么处理. AbortPolicy(): 超过负荷, 直接抛出异常. CallerRunsPolicy(): 调用者负责处理 DiscardOldestPolicy(): 丢弃队列中最老的任务. DiscardPolicy(): 丢弃新来的任务. 线程池的工作流程 创建线程池在使用线程池之前首先需要创建一个线程池实例。线程池可以使用编程语言或框架提供的相关API来创建通常需要指定线程池的参数如核心线程数、最大线程数、任务队列等。 提交任务一旦线程池创建完成就可以将需要执行的任务提交给线程池。任务可以是用户定义的代码块、函数或对象。任务的提交可以通过调用线程池提供的提交方法进行。 任务排队当任务提交到线程池后线程池会将任务添加到任务队列中。任务队列可以是有界队列或无界队列它负责存储待执行的任务。 线程分配线程池中的线程管理器会管理和分配线程。如果当前线程池中的线程数小于核心线程数线程池会创建新的线程来执行任务。如果线程池中的线程数已经达到核心线程数新的任务将被放入任务队列中等待执行。 任务执行空闲的线程会从任务队列中取出任务开始执行任务的代码。当一个线程执行完一个任务后它会继续从任务队列中获取下一个任务并执行直到任务队列为空。 拒绝策略如果任务队列已满且线程池中的线程数已达到最大线程数新提交的任务可能会被线程池拒绝。线程池会根据配置的拒绝策略来处理这些被拒绝的任务可以选择抛出异常、丢弃任务、丢弃队列中最旧的任务或者由调用者线程执行任务。 线程回收如果线程池中的线程处于空闲状态并且超过了指定的空闲线程存活时间这些空闲线程会被终止并从线程池中移除以减少资源消耗。 使用Executors 创建常见的线程池 newFixedThreadPool: 创建固定线程数的线程池 newCachedThreadPool: 创建线程数目动态增长的线程池. newSingleThreadExecutor:创建只包含单个线程的线程池. newScheduledThreadPool: 设定 延迟时间后执行命令或者定期执行命令. 是进阶版的 Timer. Executors 本质上是 ThreadPoolExecutor 类的封装. 使用newFixedThreadPool工厂方法创建“固定数量的线程池”:
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, // 核心线程数nThreads, // 最大线程数0L, // 线程最大空闲Idle时长TimeUnit.MILLISECONDS, // 时间单位毫秒new LinkedBlockingQueueRunnable() //任务的排队队列无界队列);}
newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, // 核心线程数1, // 最大线程数0L, // 线程最大空闲Idle时长TimeUnit.MILLISECONDS, //时间单位毫秒new LinkedBlockingQueueRunnable() //无界队列));}newCachedThreadPool
public static ExecutorService newCachedThreadPool(){return new ThreadPoolExecutor(0, // 核心线程数Integer.MAX_VALUE, // 最大线程数60L, // 线程最大空闲Idle时长TimeUnit.MILLISECONDS, // 时间单位毫秒new SynchronousQueueRunnable() // 任务的排队队列无界队列);}newScheduledThreadPool
public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, // 核心线程数Integer.MAX_VALUE, // 最大线程数0, //线程最大空闲Idle时长NANOSECONDS,//时间单位new DelayedWorkQueue() //任务的排队队列);}
使用Executors创建的可缓存线程池没有固定的线程数量限制它会根据任务的到来自动创建线程。如果任务的到来速度过快线程池可能会不断地创建新线程导致线程数无限增长。这可能会消耗大量的系统资源甚至导致系统崩溃。