线程池 -- 6




概述前面我们介绍了 Executor 框架Executor 框架及线程池的使用利用 Executor 框架,我们可以实现多个线程的并发调用基于 Executor 框架,java 提供了 ThreadPoolExecutor 实现了一个灵活、稳定的线程池,允许用户各种定制,同时,他还可以通过构造方法实例化一个对象来让用户根据自己的需求定制化该对象的操作 ThreadPoolExecutor 的创建ThreadPoolExecutor 的构造方法public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { ... }  通过上面的构造方法,我们就可以轻松创建一个线程池,他有下列参数:corePoolSize -- 线程池目标大小,即在没有任何任务时的线程池大小,
#读书笔记    #技术帖    #线程    #thread   
概述延迟任务就是诸如“在 100ms 以后执行”这样的任务,而周期任务则是“每 10ms 执行一次”这样的任务延迟任务与周期任务通常通过 Timer 类负责实现和管理,但是 Timer 类是基于绝对时间而不是相对时间的调度机制,系统时钟的变化会直接影响到 Timer 的执行结果,这是 Timer 的一个明显的缺陷,另一个缺陷在于 Timer 在执行所有定时任务时只会创建一个线程,所有任务的调度延迟时间都是基于上一个任务的结束时间,这样如果某个任务执行时间过长,那么将会破坏其他任务的执行,同时,一旦任务抛出了一个未知的异常,由于 Timer 线程不捕获异常也并不会尝试恢复,因此他会彻底停止执行和调度,这个问题通常被称为“线程泄漏”ScheduledThreadPoolExecutor 是替代 Timer 的一个比较好的组件,他是通过相对时间进行控制的,不依赖于系统时钟,同时任务的每次执行时间都是基于上一次任务的开始时间计算,结合并发的特性,实现了每次调度不依赖于每次实际的任务执行时间,通过 Executors 对象的工厂方法 newScheduledThreadPoo
#技术帖    #龙潭书斋    #线程    #线程池   
概述前面的日志中,我们主要介绍了 java 并发编程的基本内容和一些基本工具类我们已经知道,很多情况下,单线程线性执行的效率是不可以接受的,而为每个任务都创建线程,可能会无限制的创建下去,资源消耗会异常显著,同时,线程生命周期的开销非常高,不断创建与销毁造成了不必要的代价,而 JVM 还有这 thread 数、栈大小的限制,无线分配线程下去会很容易抛出 OutOfMemoryError,而这样的错误是非常危险的因此,在一定范围内,增加线程可以提高系统吞吐量,但如果超出了这个范围,再创建更多线程只会降低程序的执行速度,并且可能造成整个应用程序的崩溃很多时候,在原型设计和开发阶段,无线创建线程的模型可以很完美的运行,但是在高负载下运行或有人攻击你的接口的时候,这个隐患才会爆发出来 线程池此前,我们介绍过如何通过有界队列来防止高负荷的应用程序耗尽内存:java 中线程安全的容器类线程池则是另一种十分简化的线程管理工具 与上述模式相比,线程池具有显而易见的优势,顾名思义,线程池是一个缓存工作线程的资源池,当请求到来,通常无需重新创建线程,而是直接使用池中的线程,这样就减少了创建和销毁线程的巨大开销,同时也提高了响应速度通过调整线程池中线程数的多少,可以有效地保持处理器的忙碌状态,充分利用资源,也可以防
#技术帖    #龙潭书斋    #线程    #thread   
事件还原项目在线上一直运行良好,CPU、内存都有较多剩余,CPU load 长期在 0.3 左右,接到通知周内公司业务促销,可能使 QPS 上升到日常值的三倍以上,认为完全可以承受,毫无压力活动当天午高峰业务无任何异常,到晚高峰时,突然一个接口返回时间大幅上升,从原来的 100 到 200 毫秒左右上升到 2 到 3 秒,其他接口均没问题 问题定位出现这个问题,首先是采用临时加机器的方法来解决,有所好转情况十分诡异,因为虽然接口返回时间达到了 2 到 3 秒,但返回数据是无误的接口做了什么呢?逻辑十分简单,调用了一个远程接口,然后组装成一个新的对象返回查看监控,我的接口调用的接口的 99.9% 的耗时在 450 毫秒左右,而我调用该远程接口的超时时间设置为 500 毫秒,如果超时,那么是无法返回任何数据的,而实际情况是数据返回无误,也就是说依赖的这个远程接口调用成功并在 500 毫秒以内返回了数据,而本地的创建并初始化对象占用了剩余的 1.5 到 2.5 秒的时间,这显然是不合
#技术帖    #技术分享    #线程池    #pool   
概述编程中很大部分的问题只需要使用顺序编程来解决,然而,对于某些问题,需要并发的同时执行程序中多个部分则是十分方便且有必要的,尤其是在多处理器的环境中,多个部分的代码可以实际上同时执行可以极大地提高程序的执行速度,同时也可以提供更加易用的模型然而,当你企图使用并发执行任务进行编程,问题也会接踵而至,并发程序的同步问题,内存空间的共享问题等等,因此并发有时是危险的 多线程机制java 的并发是通过多线程机制实现的,每一个子任务都将有一个执行线程驱动,一个线程就是在进程中的单一顺序控制流 java.lang 包提供了三种实现多线程开发的工具:Callable 接口Runnable 接口Thread 类 他们的区别在于:Callable 任务执行后可以具有返回值,在任务执行过程中也可以抛出异常,而 Runnable 和 Thread 都不行运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果,而 Runable 和 Thread 都不行Thread 是通过实现 Runnable 接口实现的,因此可以认为&
#技术帖    #龙潭书斋    #线程    #thread   
迭代服务器迭代服务器的主进程即监听进程,进入监听状态后阻塞于 accept 操作,当监听进程 accept 到新的连接后,通过 fork 方式派生出来服务进程处理请求,处理完成后服务进程退出Apache web服务器就是以这种方式工作的优点开发流程清晰,并且服务进程与主进程隔离,安全性高缺点频繁 fork 带来机器性能的损耗,效率较低,适合请求并发量小,每次请求处理比较耗时的业务并发性服务器与迭代服务器相同,主进程进入监听状态,然后创建一个进程池或线程池,池中的业务进程或业务线程都在该 socket 上执行 accept 操作竞争请求处理权,进行请求的处理,主进程(主线程)负责维护进程池(线程池)中进程(线程)的数量和状态优点拥有较强的并发性能,可以处理并发请求量较大的应用场景异步服务器由于IO复用模型 select、epoll 等同时等待多个描述符的卓越性能,可以大大提高网络操作的效率,因此越来越多的开源力作使用异步模型进行服务的处理,如 memcache、redis、nginx 等在单进程中,监听线程通过 select、epoll 等IO复用模型进行整个服务中网络连接、读写等事件的监听优点网
#技术帖    #apache    #服务器    #技术分享   



京ICP备15018585号