后端ing

spring-cache使用记录

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

java

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

在这篇文章中,做者有条不紊的将 java 线程池知识点的前因后果都介绍了一遍。

程序员

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

设计模式

面试

Java线程池、Executor原理分析

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

正则表达式

java 线程池使用和详解

java 线程池使用和详解

算法

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

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

spring

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 已经被排满了) 的处理策略,这里有四种任务拒绝类型。

线程池工做原则

  • 一、当线程池中线程数量小于 corePoolSize 则建立线程,并处理请求。
  • 二、当线程池中线程数量大于等于 corePoolSize 时,则把请求放入 workQueue 中, 随着线程池中的核心线程们不断执行任务,只要线程池中有空闲的核心线程,线程池就从 workQueue 中取任务并处理。
  • 3 、当 taskQueue 已存满,放不下新任务时则新建非核心线程入池,并处理请求直到线程数目达到 maximumPoolSize(最大线程数量设置值)。
  • 四、若是线程池中线程数大于 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算法的神秘面纱。

相关文章
相关标签/搜索