记录-线程池相关知识点

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {

参数详解

corePoolSize(核心线程数):

表示线程池中保持活动状态的线程数量,即使它们处于空闲状态。当有任务提交时,核心线程会立即执行任务。
在大多数情况下,核心线程会一直存在,除非设置了 allowCoreThreadTimeOut 参数为 true,允许核心线程超时销毁。
maximumPoolSize(最大线程数):

表示线程池中允许创建的最大线程数量。当任务队列已满且当前线程数小于最大线程数时,线程池会创建新的线程来处理任务。
超过最大线程数的任务会被拒绝,可以通过设置饱和策略来处理这种情况。
keepAliveTime(线程空闲时间):

当线程池中的线程数量超过核心线程数时,多余的空闲线程在经过一定时间(keepAliveTime)后会被销毁,直到保持线程数不超过核心线程数。
这个参数只有在 allowCoreThreadTimeOut 被设置为 true 时才会对核心线程生效。
workQueue(任务队列):

用于存储等待执行的任务的队列。当线程池中的线程数量达到核心线程数时,新提交的任务会被放入任务队列中等待执行。
常见的任务队列包括 LinkedBlockingQueueArrayBlockingQueueSynchronousQueue 等,每种队列类型的特性不同。
threadFactory(线程工厂):

用于创建新线程的工厂。可以自定义线程工厂来指定线程的名称、优先级等属性。
rejectedExecutionHandler(拒绝策略):

当任务无法被接受时(如线程池已满),会根据设定的拒绝策略来处理这种情况。
常见的拒绝策略包括 AbortPolicy(默认)、CallerRunsPolicyDiscardPolicyDiscardOldestPolicy 等。
通过合理设置这些参数,可以根据实际需求来调整线程池的性能和行为,以达到最佳的效果。

线程池状态

Java 中,线程池的状态主要包括以下几种:

RUNNING(运行):

表示线程池处于正常运行状态,可以接受新的任务提交,也能处理已添加到队列中的任务。
SHUTDOWN(关闭):

表示线程池不再接受新的任务提交,但可以继续处理已添加到队列中的任务。调用 shutdown() 方法会将线程池状态转换为 SHUTDOWNSTOP(停止):

表示线程池不再接受新的任务提交,不处理队列中的任务,并且会尝试中断正在执行的任务。调用 shutdownNow() 方法会将线程池状态转换为 STOPTERMINATED(终止):

表示线程池已经完全终止,不再执行任何任务。
这些状态是通过线程池的控制方法和内部状态来管理的,例如 shutdown()shutdownNow() 等方法用于改变线程池的状态。当线程池处于不同的状态时,会影响线程池对新任务的接受、对现有任务的处理以及线程的生命周期管理。合理地管理线程池的状态对于保证系统的稳定性和性能至关重要。

线程池相关的参数 中corePoolSize核心线程数,
http://news.558idc.com/111521.html
http://news.558idc.com/111522.html

执行start方法时,会创建一个新的线程来执行,并使用新线程来执行定义的run方法

CompletionService.take().get()Future.get() 都可以用于获取异步任务的结果,但它们之间有一些区别。

CompletionService.take().get():

CompletionService 是一个接口,通常与 Executor 配合使用,用于提交一组带返回值的任务,并且可以按照它们完成的顺序获取结果。
take() 方法会阻塞,直到有一个任务完成并返回一个 Future 对象,表示已完成的任务。
然后,你可以调用这个 Future 对象的 get() 方法来获取任务的结果,这样可以实现按照任务完成的顺序获取结果。
这种方式适用于需要按照任务完成的顺序获取结果的场景。
Future.get():

Future 是一个接口,表示一个异步计算的结果。通过 ExecutorService.submit() 方法提交任务时会返回一个 Future 对象,可以用来获取任务的执行结果。
get() 方法也会阻塞,直到任务完成并返回结果。如果任务还没有完成,调用 get() 方法会导致当前线程阻塞,直到任务完成。
通过 Future.get() 方法获取任务结果时,无法保证获取结果的顺序和提交任务的顺序一致,只能按照任务完成的时间顺序获取结果。
这种方式适用于不需要按照任务完成顺序获取结果的场景。
总的来说,如果需要按照任务完成的顺序获取结果,可以使用 CompletionService.take().get();如果不需要保证顺序,只是想获取任务的执行结果,可以使用 Future.get()。根据具体的业务需求和场景选择合适的方式来获取异步任务的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值