java线程池

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java线程池介绍
线程池
• 根据系统自身的环境情况,有效的限制执行线程的数量,使得运 行效果达到最佳。线程主要是通过控制执行的线程的数量,超出 数量的线程排队等候,等待有任务执行完毕,再从队列最前面取 出任务执行。若队列中没有等待进程,线程池的这一资源处于等 待。当一个新任务需要运行时,如果线程池中有等待的工作线程, 就可以开始运行了;否则进入等待队列。
执行
• Runnable:可以提交给一个线程执行,也可以提交给线程池执行, 无返回结果。 • Callable:一般提交给线程池执行,返回结果。 • Future:对于具体的调度任务的执行结果进行查看,最为关键的 是Future可以检查对应的任务是否已经完成,也可以阻塞在get方 法上一直等待任务返回结果。
ThreadPoolExecutor详解(四)
线程池常用队列
• LinkedBlockingQueue:无界队列,无线程处理时,则在队列中存
储,如果不设定大小,将等待资源耗尽。
• SynchronousQueue:在某次添加元素后必须等待其他线程取走后
才能继续添加。只能由核心线程取走处理,或者创建线程处理,
ThreadPoolExecutor详解(三)
由于超出线程范围和队列容量而使执行被阻塞时所使用的策略说明。 • RejectedExecutionHandler :处理接口 • AbortPolicy():抛出java.util.concurrent.RejectedExecutionException异 常 终止策略是默认的饱和策略 • CallerRunsPolicy():当抛出RejectedExecutionException异常时,会调 rejectedExecution方法 调用者运行策略实现了一种调节机制,该策略 既不会抛弃任务也不会爆出异常,而是将任务退回给调用者,从而降 低新任务的流量 • DiscardOldestPolicy():抛弃旧的任务;当新提交的任务无法保存到队列 中等待执行时将抛弃最旧的任务,然后尝试提交新任务。如果等待队 列是一个优先级队列,抛弃最旧的策略将导致抛弃优先级最高的任务, 因此AbortPolicy最好不要和优先级队列一起使用。 • DiscardPolicy():抛弃当前的任务
ThreadPoolExecutor详解(一)
ThreadPoolExecutor的完整构造方法的签名是: ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
线程池的作用
• 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用, 可执行多个任务。 • 可以根据系统的承受能力,调整线程池中工作线线程的数目,防 止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约 1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
线程池涉及主要类
• Executor:java里面线程池的顶级接口,但是严格意义上讲 Executor并不是一个线程池,而只是一个执行线程的工具。真正 的线程池接口是ExecutorService。 • ExecutorService:真正的线程池接口 • ScheduledExecutorService:能和Timer/TimerTask类似,解决那些 需要任务重复执行的问题。 • ThreadPoolExecutor: ExecutorService的默认实现。 • ScheduledThreadPoolExecutor:继承ThreadPoolExecutor的 ScheduledExecutorService接口实现,周期性任务调度的类实现。
常用线程池(一)
Executors类里面提供了一些静态工厂,生成一些常用的线程池。 • newSingleThreadExecutor():创建一个单线程的线程池。这个线程 池只有一个线程在工作,也就是相当于单线程串行执行所有任务。 如果这个唯一的线程因为异常结束,那么会有一个新的线程来替 代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执 行。 • newFixedThreadPool(poolSize):创建固定大小的线程池。每次提 交一个任务就创建一个线程,直到线程达到线程池的最大大小。 线程池的大小一旦达到最大值就会保持不变,如果某个线程因为 执行异常而结束,那么线程池会补充一个新线程。
直到资源耗尽。
常用方法
• execute():提交执行任务。 • submit():提交任务,有返回值,可获得线程执行结果,也可以获得线 程执行异常信息。内部构造一个RunnableFuture对象,调用execute()方 法执行RunnableFuture对象。 • shutdown():当线程池调用该方法时,线程池的状态则立刻变成 SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将 会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退 出,直到添加到线程池中的任务都已经处理完成,才会退出。 • isTerminated():如果关闭后所有任务都已完成,则返回 true。注意, 除非首先调用 shutdown 或 shutdownNow,否则 isTerminated 永不为 true。
常用线பைடு நூலகம்池(二)
• newCachedThreadPool():创建一个可缓存的线程池。如果线程池 的大小超过了处理任务所需要的线程,那么就会回收部分空闲 (60秒不执行任务)的线程,当任务数增加时,此线程池又可以 智能的添加新线程来处理任务。此线程池不会对线程池大小做限 制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的 最大线程大小。 • newScheduledThreadPool(poolSize):创建一个大小无限的线程池。 此线程池支持定时以及周期性执行任务的需求。 • newSingleThreadScheduledExecutor():单一可排程的Thread
ThreadPoolExecutor详解(二)
• corePoolSize - 池中所保存的线程数,包括空闲线程。 • maximumPoolSize-池中允许的最大线程数。 • keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线 程等待新任务的最长时间。 • unit - keepAliveTime 参数的时间单位。 • workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。 • threadFactory - 执行程序创建新线程时使用的工厂。 • handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用 的处理程序。
相关文档
最新文档