后端ing

spring-cache使用记录

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

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

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

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

设计模式

Java线程池、Executor原理分析

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

java 线程池使用和详解

java 线程池使用和详解

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

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

Java 线程池艺术探索

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

Redis的并发控制

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

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

数据库

【我整理的 Java 开源项目】

  1. 整理出一些使用比较广或者个人觉得比较好的java开源项目和资料供参考。
  2. 如果你觉得好但是我没有列出的开源项目请告诉我,方便我添加到列表里。
  3. 如果你发现信息描述有误请联系我,我会及时修改或删除。
  4. 文章里面的内容会不断进行变更和补充,后续除了会新增开源项目,…


学习依赖注入与控制反转

学习依赖注入与控制反转

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<Runnable>  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():
当线程池中的数量等于最大线程数时, 抛弃线程池中工作队列头部的任务(即等待时间最久的任务),并执行新传入的任务。

参考


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算法的神秘面纱。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值