• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > JavaThreadPoolExecutor线程池调度器

JavaThreadPoolExecutor线程池调度器

作者:打鱼还是晒网 —— stone 字体:[增加 减小] 来源:互联网 时间:2017-07-22

打鱼还是晒网 —— stone通过本文主要向大家介绍了java,线程池等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

可设置的主要参数


  • corePoolSize

核心线程数,核心线程会一直存活,即使没有任务需要处理。当线程数小于核心线程数时,即使现有的线程空闲,线程池也会优先创建新线程来处理任务,而不是直接交给现有的线程处理。

核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出。

  • maxPoolSize

当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。如果线程数已等于maxPoolSize,且任务队列已满,则已超出线程池的处理能力,线程池默认会拒绝处理任务而抛出异常。可以自定义处理多余任务的RejectedExecutionHandler

该参数在某些情况下是无效的。

  • keepAliveTime

当已经执行过的线程空闲后,空闲时间小于keepAliveTime,又来了新的任务时,会直接启动该线程。

当线程空闲时间达到keepAliveTime,该线程会退出,直到线程数量等于corePoolSize。

如果allowCoreThreadTimeout设置为true,则所有线程均会退出直到线程数量为0。

  • allowCoreThreadTimeout

是否允许核心线程空闲退出,默认值为false。

  • queueCapacity

任务队列容量,由它设定一个有界的队列。从maxPoolSize的描述上可以看出,任务队列的容量会影响到线程的变化,因此任务队列的长度也需要恰当的设置。

  • RejectedExecutionHandler

    public interface RejectedExecutionHandler {
      void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
    }

    任务拒绝处理策略。在源码中定义了如下几种策略:

    • AbortPolicy (默认策略)
    public static class AbortPolicy implements RejectedExecutionHandler {
            public AbortPolicy() { }
            public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
                throw new RejectedExecutionException("Task " + r.toString() +
                                                     " rejected from " +
                                                     e.toString());
            }
        }

    该策略 直接抛出了异常。异常中止

    • CallerRunsPolicy
    public static class CallerRunsPolicy implements RejectedExecutionHandler {
        public CallerRunsPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                r.run();
            }
        }
    }

    在线程池未关闭时,直接在当前线程执行任务。所谓当前线程,即提交任务时的线程

    • DiscardPolicy
    public static class DiscardPolicy implements RejectedExecutionHandler {
        public DiscardPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        }
    }

    不做任何处理,即跳过任务r

    • DiscardOldestPolicy
    public static class DiscardOldestPolicy implements RejectedExecutionHandler {
        public DiscardOldestPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                e.getQueue().poll();
                e.execute(r);
            }
        }
    }

    在线程池未关闭时,移除处于队头的任务,再执行任务r。相当于把之前队头的任务跳过了,把r又加入了队列

 

参数对线程池任务调度的影响


当任务数大于等于corePoolSize,这时,除核心线程执行了一定数量的任务后,

余下的需要执行的任务数为int count = tasksCount - corePoolSize,设队列最大容量为capacity:

  • 若capacity >= count,则只会创建corePoolSize个线程来执行任务。多的任务放在队列中。

    这时maxPoolSize,就无效了

  • 若capacity < count,这时有int remain = tasksCount - capacity:

    • 若 remain <= maxPoolSize,创建remain个线程来执行任务。多的任务放在队列中
    • 若remain > maxPoolSize,创建maxPoolSize个线程来执行任务;这时将有remain-maxPoolSize个任务无法加入队列,被RejectedExecutionHandler处理。

 

Executors生成ThreadPoolExecutor


(most from http://dongxuan.iteye.com/blog/901689)

在构建时,corePoolSize、maximumPoolSizes 和BlockingQueue的选择,直接影响线程调度的策略

Executors 有三个方法可以生成 ThreadPoolExecutor

生成一个固定线程数的 ThreadPoolExecutor

public static ExecutorService newFixedThreadPool(int nThreads) {

? return new ThreadPoolExecutor(nThreads, nThreads,

? 0L, TimeUnit.MILLISECONDS,

? new LinkedBlockingQueue());

}

LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。在ThreadPoolExecutor中主要使用的是BlockingQueue的offer()和 poll()、take()

LinkedBlockingQueue 无界队列

生成一个只含一个线程的ThreadPoolExecutor

public static ExecutorService newSingleThreadExecutor() {

? return new FinalizableDelegatedExecutorService

? (new ThreadPoolExecutor(1, 1,

? 0L, TimeUnit.MILLISECONDS,

? new LinkedBlockingQueue()));

}

LinkedBlockingQueue 无界队列

生成一个无界的并直接提交的ThreadPoolExecutor

pub

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • JavaThreadPoolExecutor线程池调度器
  • 全面掌握Java内部类
  • Java中的常用阻塞队列源码分析
  • Java虚拟机(四)垃圾收集算法
  • Java内存模型与线程
  • Java中如何优雅正确的终止线程
  • [译]深入字节码操作:使用ASM和Javassist创建审核日志
  • IntelliJIDEA平台下JNI编程(五)—本地C代码创建Java对象及引用
  • 【java总结】设计模式详解
  • Java代码中常见技术债务处理之Exception

相关文章

  • 2017-05-28spring boot中的静态资源加载处理方式
  • 2017-09-13java中Collection对象的使用
  • 2017-05-28Java 基础之事务详细介绍
  • 2017-05-28Java Scaner类详解_动力节点Java学院整理
  • 2017-05-28Java 加密解密基础分类及模式归纳整理
  • 2017-05-28Java异常继承结构解析_动力节点Java学院整理
  • 2017-05-28详解Spring Boot 定时任务的实现方法
  • 2017-05-28Java通过Fork/Join优化并行计算
  • 2018-01-02java基础-抽象类
  • 2017-05-28spring boot和mybatis集成分页插件

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入理解hibernate的三种状态
    • spring boot 图片上传与显示功能实例详解
    • java实现短信通信的完整教程
    • Spring Boot的listener(监听器)简单使用实例详解
    • SWT JFace 小制作 文本阅读器
    • Struts2 控制文件上传下载功能实例代码
    • Java中四种访问权限资料整理
    • 详解java枚举用法及实例
    • java中-jar 与nohup的对比
    • 详解Spring整合Quartz实现动态定时任务

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有