java线程池七大参数(Java线程池几个参数)

:暂无数据 2025-08-21 02:40:04 0
大家好,关于java线程池七大参数很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Java线程池几个参数的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

Java线程池几个参数

corePollSize:核心线程数。
maximumPoolSize:最大线程数。
keepAliveTime:空闲的线程保留的时间。
TimeUnit:空闲线程的保留时间单位。
BlockingQueue《Runnable》:阻塞队列,存储等待执行的任务。
ThreadFactory:线程工厂,用来创建线程。
RejectedExecutionHandler:队列已满,而且任务量大于最大线程的异常处理策略。

线程池的实现原理 Java线程池实现原理

1、java线程池的实现原理很简单,说白了就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队列中有任务了就取出来继续执行。

2、线程池的几个主要参数的作用

corePoolSize: 规定线程池有几个线程(worker)在运行。

maximumPoolSize: 当workQueue满了,不能添加任务的时候,这个参数才会生效。规定线程池最多只能有多少个线程(worker)在执行。

keepAliveTime: 超出corePoolSize大小的那些线程的生存时间,这些线程如果长时间没有执行任务并且超过了keepAliveTime设定的时间,就会消亡。

unit: 生存时间对于的单位

workQueue: 存放任务的队列

threadFactory: 创建线程的工厂

handler: 当workQueue已经满了,并且线程池线程数已经达到maximumPoolSize,将执行拒绝策略。

java线程池中的线程数应该如何设置

java中线程池的监控可以检测到正在执行的线程数。
通过线程池提供的参数进行监控。线程池里有一些属性在监控线程池的时候可以使用
taskCount:线程池需要执行的任务数量。
completedTaskCount:线程池在运行过程中已完成的任务数量。小于或等于taskCount。
largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了。
getPoolSize:线程池的线程数量。如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不+ getActiveCount:获取活动的线程数。
通过扩展线程池进行监控。通过继承线程池并重写线程池的beforeExecute,afterExecute和terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一些事情。如监控任务的平均执行时间,最大执行时间和最小执行时间等。这几个方法在线程池里是空方法。如:
protected void beforeExecute(Thread t, Runnable r) { }

面试题:线程池有几种实现方式,线程池的七大参数有哪些

在Java编码的过程中,我们经常会创建一个线程来提高程序的执行效率,虽然这样实现起来很方便,但是会有一个问题:如果并发的线程数多,并且每个线程都是执行一个时间很短的任务就结束了,这样会造成频繁的创建和销毁线程从而导致降低系统的效率。
那么问题来了,有没有办法可用复用创建好的线程呢,也就是线程执行完一个任务后,不被销毁,继续执行其他的任务?
在Java可以通过线程池来实现这样的效果。
下面从三个方面和大家一起来探讨一下Java线程池相关的内容。
1.Java中的ThreadPoolExecutor类。
2.Java中4种线程池的使用。
3.Java线程池常用参数如何设置。
一、Java中的ThreadPoolExecutor类
A.ThreadPoolExecutor的重要参数
1.corePoolSize:核心线程数
核心线程会一直存活,及时没有任务需要执行。
当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理。
设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。
2.queueCapacity:任务队列容量(阻塞队列)
当核心线程数达到最大时,新任务会放在队列中排队等待执行。
3.maxPoolSize:最大线程数
当线程数》=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务。
当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常。
4.keepAliveTime:线程空闲时间
当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize。
如果allowCoreThreadTimeout=true,则会直到线程数量=0。
5.allowCoreThreadTimeout:允许核心线程超时
6.rejectedExecutionHandler:任务拒绝处理器。
B.ThreadPoolExecutor执行过程
1.当线程数小于核心线程数时,创建线程。
2.当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
3.当线程数大于等于核心线程数,且任务队列已满。(1)若线程数小于最大线程数,创建线程。(2)若线程数等于最大线程数,抛出异常,拒绝任务。
二、Java中4种线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

java如何确定线程池最多线程的大小

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, handler);
参数:
corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。
runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。 可以选择以下几个阻塞队列。
ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。
SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
PriorityBlockingQueue:一个具有优先级的无限阻塞队列。
maximumPoolSize(线程池最大大小):线程池允许创建的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是如果使用了无界的任务队列这个参数就没什么效果。
ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字。
RejectedExecutionHandler(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。以下是JDK1.5提供的四种策略。
AbortPolicy:直接抛出异常。
CallerRunsPolicy:只用调用者所在线程来运行任务。
DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
DiscardPolicy:不处理,丢弃掉。
当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的任务。
keepAliveTime(线程活动保持时间):线程池的工作线程空闲后,保持存活的时间。所以如果任务很多,并且每个任务执行的时间比较短,可以调大这个时间,提高线程的利用率。
TimeUnit(线程活动保持时间的单位):可选的单位有天(DAYS),小时(HOURS),分钟(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS, 千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。

线程池七大核心参数

线程池七大核心参数是corePoolSize、maximumPoolSize、KeepAliveTime、unit、workQueue、threadFactory、handler。

1、corePoolSize核心线程数

线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,它们也不会被销毁,除非设置了alowCoreThreadTimeOut,这里的最小线程数量即是corePoolSize,任务提交到线程池后,首先会检查当前线程数是否达到了corePoolSize,如果没有达到的话,则会创建个新线程来处理这个任务。

2、maximumPoolSize最大线程数

当前线程数达到corePoolSize后,如果继续有任务被提交到线程池,会将任务缓存到任务队列中。如果队列也已满,则会去创建一个新线程来出来这个处理。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。

3、KeepAliveTime空闲线程存活时间

一个线程如果处于空闲状态,并且当前的线程数量大于corePolSize,那么在指定时间后,这个空闲线程会被销毁,这里的指定时间由keepAliveTime来设定。

4、unit空闲线程存活时间单位

keepAliveTime的计量单位。

5、workQueue任务队列

新任务被提交后,会先进入到此任务队列中,任务调度时再从队列中取出任务。

6、threadFactory线程工厂

创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等。

7、handler拒绝策略

当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,该如何处理呢?这里的拒绝策略,就是解决这个问题的。

线程池的模式介绍:

1、半同步/半异步模式又称为生产者消费者模式,是比较常见的实现方式,比较简单。分为同步层、队列层、异步层三层。同步层的主线程处理工作任务并存入工作队列,工作线程从工作队列取出任务进行处理,如果工作队列为空,则取不到任务的工作线程进入挂起状态。由于线程间有数据通信,因此不适于大数据量交换的场合。

2、领导者跟随者模式,在线程池中的线程可处在3种状态之一:领导者leader、追随者follower或工作者processor。任何时刻线程池只有一个领导者线程。事件到达时,领导者线程负责消息分离,并从处于追随者线程中选出一个来当继任领导者,然后将自身设置为工作者状态去处置该事件。

处理完毕后工作者线程将自身的状态置为追随者。这一模式实现复杂,但避免了线程间交换任务数据,提高了CPUcache相似性。在ACE中,提供了领导者跟随者模式实现。

线程池有几种实现方式,线程池的七大参数有哪些

  • 一:创建大小不固定的线程池  

  • 二:创建固定数量线程的线程池  

  • 三:创建单线程的线程池  

  • 四:创建定时线程  

  • 1.创建大小不固定的线程池

     view plain copy

  • package com.peace.pms.Test;  

  • import java.util.concurrent.ExecutorService;  

  • import java.util.concurrent.Executors;  

  • /** 

  • * @Author: cxx 

  • * @Date: 2018/3/3 17:16 

  • */  

  • public class ThreadPoolDemo {  

  • public static class Taskdemo implements Runnable{  

  • @Override  

  • public void run() {  

  • for(int i=0;i《10;i++){  

  • System.out.println(Thread.currentThread().getName()+":"+i);  

  • }  

  • }  

用过哪些线程池,区别,threadpoolexecutor各个参数意义是什么,使用场景

线程是一个操作系统概念。操作系统负责这个线程的创建、挂起、运行、阻塞和终结操作。而操作系统创建线程、切换线程状态、终结线程都要进行CPU调度——这是一个耗费时间和系统资源的事情。
另一方面,大多数实际场景中是这样的:处理某一次请求的时间是非常短暂的,但是请求数量是巨大的。这种技术背景下,如果我们为每一个请求都单独创建一个线程,那么物理机的所有资源基本上都**作系统创建线程、切换线程状态、销毁线程这些操作所占用,用于业务请求处理的资源反而减少了。所以最理想的处理方式是,将处理请求的线程数量控制在一个范围,既保证后续的请求不会等待太长时间,又保证物理机将足够的资源用于请求处理本身。

Java线程池

java常用的线程池有三种:
1.
newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。
参数:
nThreads - 池中的线程数
返回:
新创建的线程池
抛出:
IllegalArgumentException - 如果 nThreads 《= 0
2.
newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor()创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
返回:
新创建的单线程 Executor
3.
newCachedThreadPool
public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
返回:
新创建的线程池

OK,关于java线程池七大参数和Java线程池几个参数的内容到此结束了,希望对大家有所帮助。
本文编辑:admin

更多文章:


java静态数组初始化(java 数组 静态和动态初始化的区别)

java静态数组初始化(java 数组 静态和动态初始化的区别)

今天给各位分享java 数组 静态和动态初始化的区别的知识,其中也会对java 数组 静态和动态初始化的区别进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

js打开本地html(怎么用js打开本地网页)

js打开本地html(怎么用js打开本地网页)

大家好,今天小编来为大家解答以下的问题,关于js打开本地html,怎么用js打开本地网页这个很多人还不知道,现在让我们一起来看看吧!

java线程池七大参数(Java线程池几个参数)

java线程池七大参数(Java线程池几个参数)

大家好,关于java线程池七大参数很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Java线程池几个参数的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

随机生成正负1函数(excel随机函数,生成-1到1之间,不为0的保留两位位小数)

随机生成正负1函数(excel随机函数,生成-1到1之间,不为0的保留两位位小数)

大家好,今天小编来为大家解答以下的问题,关于随机生成正负1函数,excel随机函数,生成-1到1之间,不为0的保留两位位小数这个很多人还不知道,现在让我们一起来看看吧!

antd select(在使用antd遇到的不常见问题(一))

antd select(在使用antd遇到的不常见问题(一))

今天给各位分享在使用antd遇到的不常见问题(一)的知识,其中也会对在使用antd遇到的不常见问题(一)进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

神经网络concat(如何用caffe解决回归问题)

神经网络concat(如何用caffe解决回归问题)

大家好,神经网络concat相信很多的网友都不是很明白,包括如何用caffe解决回归问题也是一样,不过没有关系,接下来就来为大家分享关于神经网络concat和如何用caffe解决回归问题的一些知识点,大家可以关注收藏,免得下次来找不到哦,下

linux搭建python环境(如何在Linux下的sublime text 2搭建python开发IDE)

linux搭建python环境(如何在Linux下的sublime text 2搭建python开发IDE)

大家好,关于linux搭建python环境很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于如何在Linux下的sublime text 2搭建python开发IDE的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以

帝国时代为什么花屏?exagear玩帝国2程序错误

帝国时代为什么花屏?exagear玩帝国2程序错误

大家好,今天小编来为大家解答以下的问题,关于帝国程序,帝国时代为什么花屏这个很多人还不知道,现在让我们一起来看看吧!

strcpy a b 什么意思(c语言中strcpy,strcat什么意思)

strcpy a b 什么意思(c语言中strcpy,strcat什么意思)

今天给各位分享c语言中strcpy,strcat什么意思的知识,其中也会对c语言中strcpy,strcat什么意思进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

script defer(JS异步加载的几种方式)

script defer(JS异步加载的几种方式)

大家好,今天小编来为大家解答以下的问题,关于script defer,JS异步加载的几种方式这个很多人还不知道,现在让我们一起来看看吧!

最近更新

电信在线测速(如何测试电信网速)
2025-08-21 04:00:03 浏览:0
business(business的意思)
2025-08-21 03:00:05 浏览:0
热门文章

口语100下载(口语100电脑版怎样下载)
2025-06-27 09:00:02 浏览:10
premiere pro怎么读(premiere怎么读)
2025-06-27 05:00:01 浏览:9
标签列表