资讯专栏INFORMATION COLUMN

后端ing

roadtogeek / 2748人阅读

摘要:当活动线程核心线程非核心线程达到这个数值后,后续任务将会根据来进行拒绝策略处理。线程池工作原则当线程池中线程数量小于则创建线程,并处理请求。当线程池中的数量等于最大线程数时默默丢弃不能执行的新加任务,不报任何异常。

spring-cache使用记录

spring-cache的使用记录,坑点记录以及采用的解决方案

深入分析 java 线程池的实现原理

在这篇文章中,作者有条不紊的将 java 线程池知识点的来龙去脉都介绍了一遍。

史上最全设计模式导学目录

设计模式

Java线程池、Executor原理分析

基于源码,分析Java线程池实现。

java 线程池使用和详解

java 线程池使用和详解

JS正则表达式完整教程(略长)

亲爱的读者朋友,如果你点开了这篇文章,说明你对正则很感兴趣。 想必你也了解正则的重要性,在我看来正则表达式是衡量程序员水平的一个侧面标准。 关于正则表达式的教程,网上也有很多,相信你也看了一些。 与之不同的是,本文的目的是希望所有认真读完的童鞋们,都有实质性的提高。 本文内容共…

Java 线程池艺术探索

文章一开始讲了线程池的介绍和好处,然后分析了线程池中最核心的 ThreadPoolExecutor 类中构造器的七个参数的作用、类中两个重要的方法,然后在对比研究了下 JDK 中自带的四种线程池的用法和内部代码细节,最后写了一个自定义的线程池。

Redis的并发控制

有关使用Redis对并发控制的实战解决方案

如果有人问你数据库的原理,叫他看这篇文章

数据库

【我整理的 Java 开源项目】

整理出一些使用比较广或者个人觉得比较好的java开源项目和资料供参考。

如果你觉得好但是我没有列出的开源项目请告诉我,方便我添加到列表里。

如果你发现信息描述有误请联系我,我会及时修改或删除。

文章里面的内容会不断进行变更和补充,后续除了会新增开源项目,…


学习依赖注入与控制反转

学习依赖注入与控制反转

JAVA回忆录之泛型篇

泛型是JDK1.5版本中加入的,在没有泛型之前,从集合中读取到的每一个对象都必须进行转化。如果有有人不小心插入了类型错误的对象,在运行时的转化处理就会出错。有了泛型之后,可以告诉变一起每个集合中接受那些对象类型。编译器自动地为你的插入进行转化,并在编译时告知是否插入了类型错误的对象。

从使用到原理学习 Java 线程池

关于 Java 线程池的使用,及原理分析, 分析角度新颖

线程池执行原则及参数详解

本文介绍关于线程池的执行原则以及构造方法的参数详解。

线程池的好处

引用自 http://ifeve.com/java-threadpool/ 的说明:

降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。

提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

创建线程池
// 参数初始化

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
// 核心线程数量大小
private static final int corePoolSize = Math.max(2, Math.min(CPU_COUNT - 1, 4));
// 线程池最大容纳线程数
private static final int maximumPoolSize = CPU_COUNT * 2 + 1;
// 线程空闲后的存活时长
private static final int keepAliveTime = 30;

// 任务过多后,存储任务的一个阻塞队列
BlockingQueue  workQueue = new SynchronousQueue<>();

// 创建线程的工厂
ThreadFactory threadFactory = new ThreadFactory() {
    private final AtomicInteger mCount = new AtomicInteger(1);

    public Thread newThread(Runnable r) {
        return new Thread(r, "AdvacnedAsyncTask #" + mCount.getAndIncrement());
    }
};

// 线程池任务满载后采取的任务拒绝策略
RejectedExecutionHandler rejectHandler = new ThreadPoolExecutor.DiscardOldestPolicy();

// 线程池对象,创建线程
ThreadPoolExecutor mExecute = new ThreadPoolExecutor(
        corePoolSize, 
        maximumPoolSize,
        keepAliveTime,
        TimeUnit.SECONDS,
        workQueue,
        threadFactory, 
        rejectHandler
);
具体参数介绍

corePoolSize

线程池的核心线程数。在没有设置 allowCoreThreadTimeOut 为 true 的情况下,核心线程会在线程池中一直存活,即使处于闲置状态。

maximumPoolSize

线程池所能容纳的最大线程数。当活动线程 (核心线程 + 非核心线程) 达到这个数值后,后续任务将会根据 RejectedExecutionHandler 来进行拒绝策略处理。

keepAliveTime

 非核心线程  闲置时的超时时长。超过该时长,非核心线程就会被回收。若线程池通过 allowCoreThreadTimeOut() 方法设置 allowCoreThreadTimeOut 属性为 true,则该时长同样会作用于核心线程,AsyncTask 配置的线程池就是这样设置的。

unit

keepAliveTime 时长对应的单位。

workQueue

线程池中的任务队列,通过线程池的 execute() 方法提交的 Runnable 对象会存储在该队列中。

ThreadFactory

线程工厂,功能很简单,就是为线程池提供创建新线程的功能。这是一个接口,可以通过自定义,做一些自定义线程名的操作。

RejectedExecutionHandler

当任务无法被执行时 (超过线程最大容量 maximum 并且 workQueue 已经被排满了) 的处理策略,这里有四种任务拒绝类型。
线程池工作原则

1、当线程池中线程数量小于 corePoolSize 则创建线程,并处理请求。

2、当线程池中线程数量大于等于 corePoolSize 时,则把请求放入 workQueue 中, 随着线程池中的核心线程们不断执行任务,只要线程池中有空闲的核心线程,线程池就从 workQueue 中取任务并处理。

3 、当 taskQueue 已存满,放不下新任务时则新建非核心线程入池,并处理请求直到线程数目达到 maximumPoolSize(最大线程数量设置值)。

4、如果线程池中线程数大于 maximumPoolSize 则使用 RejectedExecutionHandler 来进行任务拒绝处理。

任务队列 BlockingQueue

任务队列 workQueue 是用于存放不能被及时处理掉的任务的一个队列,它是
一个 BlockingQueue 类型。

关于 BlockingQueue,虽然它是 Queue 的子接口,但是它的主要作用并不是容器,而是作为线程同步的工具,他有一个特征,当生产者试图向 BlockingQueue 放入 (put) 元素,如果队列已满,则该线程被阻塞;当消费者试图从 BlockingQueue 取出 (take) 元素,如果队列已空,则该线程被阻塞。(From 疯狂 Java 讲义)
任务拒绝类型

ThreadPoolExecutor.AbortPolicy:

当线程池中的数量等于最大线程数时抛 java.util.concurrent.RejectedExecutionException 异常,涉及到该异常的任务也不会被执行,线程池默认的拒绝策略就是该策略。

ThreadPoolExecutor.DiscardPolicy():

当线程池中的数量等于最大线程数时, 默默丢弃不能执行的新加任务,不报任何异常。

ThreadPoolExecutor.CallerRunsPolicy():

当线程池中的数量等于最大线程数时,重试添加当前的任务;它会自动重复调用 execute()方法。

ThreadPoolExecutor.DiscardOldestPolicy():

当线程池中的数量等于最大线程数时, 抛弃线程池中工作队列头部的任务(即等待时间最久的任务),并执行新传入的任务。
参考

聊聊并发(三)Java 线程池的分析和使用

Android 线程池(二)——ThreadPoolExecutor 及其拒绝策略 RejectedExecutionHandler 使用示例

多线程 线程池 ThreadPoolExecutor 介绍


ThreadPoolExecutor 核心实现原理和源码解析

本文将详细分析 ThreadPoolExecutor 的实现原理,并结合源码介绍 ThreadPoolExecutor 的重要操作,对理解 ThreadPoolExecutor 非常有帮助。本文中源码基于 JDK1.7

反射进阶,编写反射代码值得注意的诸多细节

本文详细解释了运用反射进行代码编写时遭遇到的各种常见的 Exception,以及使用反射时需要注意的一些细节问题。

ThreadPoolExecutor线程池

ThreadPoolExecutor线程池

分析 Java 线程池执行原理

分析线程池源码

JAVA中的静态代理、动态代理以及CGLIB动态代理

代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用。对于java的代理模式,一般可分为:静态代理、动态代理、以及CGLIB实现动态代理。对于上述三种代理模式,分别进行说明。

经典算法面试题 | 最少操作数使数组元素相等 I & II 大合集

专栏 | 九章算法 网址 | www.jiuzhang.com 最少操作数使数组元素相等 I 题目描述 给定一个长度为n的非空整数数组,找出使数组所有元素均相等的最少操作数,其中一次操作将其中n-1个数加上1。 样例 输入: [1,2,3] 输出: 3 说明: 最少3次操作到达…

hash算法原理详解

主要是对hash算法中运用到的知识进行进一步的解析,帮助初学者进一步揭开hash算法的神秘面纱。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68337.html

相关文章

  • 那些年,我的前端/Java后端书单

    摘要:全文为这些年,我曾阅读深入理解过或正在阅读学习即将阅读的一些优秀经典前端后端书籍。当然,如果您喜欢这篇文章,可以动手点点赞或者收藏。 全文为这些年,我曾阅读、深入理解过(或正在阅读学习、即将阅读)的一些优秀经典前端/Java后端书籍。全文为纯原创,且将持续更新,未经许可,不得进行转载。当然,如果您喜欢这篇文章,可以动手点点赞或者收藏。 基础 基础书籍 进阶 进阶阶段,深入学习的书...

    fxp 评论0 收藏0
  • 那些年,我的前端/Java后端书单

    摘要:全文为这些年,我曾阅读深入理解过或正在阅读学习即将阅读的一些优秀经典前端后端书籍。当然,如果您喜欢这篇文章,可以动手点点赞或者收藏。 全文为这些年,我曾阅读、深入理解过(或正在阅读学习、即将阅读)的一些优秀经典前端/Java后端书籍。全文为纯原创,且将持续更新,未经许可,不得进行转载。当然,如果您喜欢这篇文章,可以动手点点赞或者收藏。 基础 基础书籍 进阶 进阶阶段,深入学习的书...

    Tecode 评论0 收藏0
  • 那些年,我的前端/Java后端书单

    摘要:全文为这些年,我曾阅读深入理解过或正在阅读学习即将阅读的一些优秀经典前端后端书籍。当然,如果您喜欢这篇文章,可以动手点点赞或者收藏。 全文为这些年,我曾阅读、深入理解过(或正在阅读学习、即将阅读)的一些优秀经典前端/Java后端书籍。全文为纯原创,且将持续更新,未经许可,不得进行转载。当然,如果您喜欢这篇文章,可以动手点点赞或者收藏。 基础 基础书籍 进阶 进阶阶段,深入学习的书...

    VPointer 评论0 收藏0
  • 那些年,我的前端/Java后端书单

    摘要:全文为这些年,我曾阅读深入理解过或正在阅读学习即将阅读的一些优秀经典前端后端书籍。当然,如果您喜欢这篇文章,可以动手点点赞或者收藏。 全文为这些年,我曾阅读、深入理解过(或正在阅读学习、即将阅读)的一些优秀经典前端/Java后端书籍。全文为纯原创,且将持续更新,未经许可,不得进行转载。当然,如果您喜欢这篇文章,可以动手点点赞或者收藏。 基础 基础书籍 进阶 进阶阶段,深入学习的书...

    idealcn 评论0 收藏0
  • 个人的web商城网站

    摘要:于是在查找了大量资料,思考着技术选型,终于决定做一个展现商品的全栈网站。当然这个网站还有许许多多需要完善并增加的功能,在此之后也会不断去完善这个网站。所幸的是问题都已经解决,项目也顺利部署。 项目介绍 1、作为前端的菜鸟,每每看到Github上有很多大神分享着自己的项目时,内心都是蠢蠢欲动,这次终于下定决心要给自己一段时间来完成属于自己的一份作品。2、于是在查找了大量资料,思考着技术选...

    quietin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<