线程池

ThreadPoolTaskExecutor的配置

纵然是瞬间 提交于 2020-04-07 05:03:57
ThreadPoolTaskExecutor的配置在网上找了很多解释没找到,看了下ThreadPoolExecutor的配置,名字差不多,应该含义也差不多。只不过ThreadPoolTaskExecutor对 ThreadPoolExecutor做了包装。 <bean id ="taskExecutor" class ="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" > <property name ="corePoolSize" value ="5" /> <property name ="keepAliveSeconds" value ="300" /> <property name ="maxPoolSize" value ="10" /> <property name ="queueCapacity" value ="25" /> </bean> 线程的配置文件: corePoolSize: 线程池维护线程的最少数量 keepAliveSeconds 线程池维护线程所允许的空闲时间 maxPoolSize 线程池维护线程的最大数量 queueCapacity 线程池所使用的缓冲队列 当一个任务通过execute(Runnable)方法欲添加到线程池时: l

java线程池概念解析

谁都会走 提交于 2020-04-06 20:46:14
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的缓冲队列 handler: 线程池对拒绝任务的处理策略 一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。 当一个任务通过execute(Runnable)方法欲添加到线程池时: 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列

大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?

纵饮孤独 提交于 2020-04-06 14:53:34
前言 博文地址: https://sourl.cn/URptix 当一个 HTTP 请求到达 Tomcat,Tomcat 将会从线程池中取出线程,然后按照如下流程处理请求: 将请求信息解析为 HttpServletRequest 分发到具体 Servlet 处理相应的业务 通过 HttpServletResponse 将响应结果返回给等待客户端 整体流程如下所示: 这是我们日常最常用同步请求模型,所有动作都交给同一个 Tomcat 线程处理,所有动作处理完成,线程才会被释放回线程池。 想象一下如果业务需要较长时间处理,那么这个 Tomcat 线程其实一直在被占用,随着请求越来越多,可用 I/O 线程越来越少,直到被耗尽。这时后续请求只能等待空闲 Tomcat 线程,这将会加长了请求执行时间。 如果客户端不关心返回业务结果,这时我们可以自定义线程池,将请求任务提交给线程池,然后立刻返回。 也可以使用 Spring Async 任务,大家感兴趣可以自行查找一下资料 但是很多场景下,客户端需要处理返回结果,我们没办法使用上面的方案。在 Servlet2 时代,我们没办法优化上面的方案。 不过等到 Servlet3 ,引入异步 Servelt 新特性,可以完美解决上面的需求。 异步 Servelt 执行请求流程: 将请求信息解析为 HttpServletRequest 分发到具体

如何优雅的关闭Java线程池

♀尐吖头ヾ 提交于 2020-04-06 08:52:02
如何优雅的关闭Java线程池 面试中经常会问到,创建一个线程池需要哪些参数啊,线程池的工作原理啊,却很少会问到线程池如何安全关闭的。 也正是因为大家不是很关注这块,即便是工作三四年的人,也会有因为线程池关闭不合理,导致应用无法正常stop的情况,还有出现一些报错的问题。 本篇就以ThreadPoolExecutor为例,来介绍下如何优雅的关闭线程池。 01 线程中断 在介绍线程池关闭之前,先介绍下Thread的interrupt。 在程序中,我们是不能随便中断一个线程的,因为这是极其不安全的操作,我们无法知道这个线程正运行在什么状态,它可能持有某把锁,强行中断可能导致锁不能释放的问题;或者线程可能在操作数据库,强行中断导致数据不一致混乱的问题。正因此,JAVA里将Thread的stop方法设置为过时,以禁止大家使用。 一个线程什么时候可以退出呢?当然只有线程自己才能知道。 所以我们这里要说的Thread的interrrupt方法,本质不是用来中断一个线程。是将线程设置一个中断状态。 当我们调用线程的interrupt方法,它有两个作用: 1、如果此线程处于阻塞状态(比如调用了wait方法,io等待),则会立马退出阻塞,并抛出InterruptedException异常,线程就可以通过捕获InterruptedException来做一定的处理,然后让线程退出。 2

手写线程池

跟風遠走 提交于 2020-04-04 05:41:35
Executors.newSingleThreadExecutor(): 只有一个线程的线程池,因此所有提交的任务是顺序执行 Executors.newCachedThreadPool(): 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行, 如果线程超过60秒内没执行,那么将被终止并从池中删除 Executors.newFixedThreadPool(): 拥有固定线程数的线程池,如果没有任务执行,那么线程会一直等待 Executors.newScheduledThreadPool(): 用来调度即将执行的任务的线程池 Executors.newWorkStealingPool(): newWorkStealingPool适合使用在很耗时的操作, 但是newWorkStealingPool不是ThreadPoolExecutor的扩展, 它是新的线程池类ForkJoinPool的扩展,但是都是在统一的一个Executors类中实现, 由于能够合理的使用CPU进行对任务操作(并行操作),所以适合使用在很耗时的任务中 生产环境不使用以上线程池,主要原因是,以上线程池底层使用的LinkedBlockingQueue链表阻塞 队列,这样最大值为21亿,范围过大,会造成OOM异常。 需要使用ThreadPoolExecutor传递7个参数手工实现线程池。

Android 线程操作之线程池

a 夏天 提交于 2020-04-04 05:09:23
Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。 1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差。 b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 c. 缺乏更多功能,如定时执行、定期执行、线程中断。 相比new Thread,Java提供的四种线程池的好处在于: a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。 b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 c. 提供定时执行、定期执行、单线程、并发数控制等功能。 2、Java 线程池 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

Java(Android)线程池妙用

别等时光非礼了梦想. 提交于 2020-04-04 04:01:37
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。 1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差。 b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 c. 缺乏更多功能,如定时执行、定期执行、线程中断。相比new Thread,Java提供的四种线程池的好处在于。 a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。 b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 c. 提供定时执行、定期执行、单线程、并发数控制等功能。 2、Java 线程池 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

ThreadLocal系列(三)-TransmittableThreadLocal的使用及原理解析

流过昼夜 提交于 2020-04-03 10:33:17
上一篇: ThreadLocal系列(二)-InheritableThreadLocal的使用及原理解析 一、基本使用 首先,TTL是用来解决ITL解决不了的问题而诞生的,所以TTL一定是支持父线程的本地变量传递给子线程这种基本操作的,ITL也可以做到,但是前面有讲过,ITL在线程池的模式下,就没办法再正确传递了,所以TTL做出的改进就是即便是在线程池模式下,也可以很好的将父线程本地变量传递下去,先来看个例子: // 需要注意的是,使用TTL的时候,要想传递的值不出问题,线程池必须得用TTL加一层代理(下面会讲这样做的目的) private static ExecutorService executorService = TtlExecutors.getTtlExecutorService(Executors.newFixedThreadPool(2)); private static ThreadLocal tl = new TransmittableThreadLocal<>(); //这里采用TTL的实现 public static void main(String[] args) { new Thread(() -> { String mainThreadName = "main_01"; tl.set(1); executorService.execute(() -> {

ICE FAQ:Why do I not get concurrent invocations in a server?

自闭症网瘾萝莉.ら 提交于 2020-04-03 06:31:55
为什么我不能进行并发的调用? By default, the Ice server-side run time uses a thread pool to dispatch incoming requests. The number of requests that can execute concurrently in a server is limited to the number of threads in the pool. If more clients attempt to concurrently call operations than there are threads in the pool, the corresponding requests are not dispatched until a currently executing invocation completes and returns its thread to the pool; that thread then picks up the next pending request. 默认情况下,ICE服务端运行环境使用一个线程池处理外来的请求。一个服务器中可以并发执行的请求数受限于线程池中的线程数,如果客户端进行并发调用的数目超过了线程池中线程的数目,对相应请求的响应将不会执行

谈谈Java的线程池设计

懵懂的女人 提交于 2020-04-02 20:16:53
在实际项目中,如果因为想异步执行暂时性的任务而不断创建线程是很浪费资源的事情(当一个任务执行完后,线程也没用了)。这种情况下,最好是将任务提交给线程池执行。 所谓池,就是将管理某一种资源,对资源进行复用的对象。线程池就是对线程管理的对象。 本文就是介绍线程池内部是如何管理线程,并复用线程的。 相关接口 JDK在内部对线程池提供了大致四层的接口(类)用来提供线程池的行为,分别是顶层接口 Executor (这个接口可以理解为执行器,负责执行任务,),可关闭的执行器 ExecutorService (这个接口开始才具备线程池的概念),提供线程池基本框架的抽象类 AbstractExecutorService ,以及线程池的具体实现 ThreadPoolExecutor 。 Executor /** * 线程池顶层接口 * 可以执行提交的命令 */ public interface Executor { /** * 执行提交的命令 * @param command */ void execute(Runnable command); } Executor 只定义了线程池一个行为 execute() 方法,负责执行提交的任务。 ExecutorService package java.util.concurrent; import java.util.List; import java