spring-cache的使用记录,坑点记录以及采用的解决方案
java
在这篇文章中,做者有条不紊的将 java 线程池知识点的前因后果都介绍了一遍。
程序员
设计模式
面试
基于源码,分析Java线程池实现。
正则表达式
java 线程池使用和详解
算法
亲爱的读者朋友,若是你点开了这篇文章,说明你对正则很感兴趣。 想必你也了解正则的重要性,在我看来正则表达式是衡量程序员水平的一个侧面标准。 关于正则表达式的教程,网上也有不少,相信你也看了一些。 与之不一样的是,本文的目的是但愿全部认真读完的童鞋们,都有实质性的提升。 本文内容共…
spring
文章一开始讲了线程池的介绍和好处,而后分析了线程池中最核心的 ThreadPoolExecutor 类中构造器的七个参数的做用、类中两个重要的方法,而后在对比研究了下 JDK 中自带的四种线程池的用法和内部代码细节,最后写了一个自定义的线程池。
数据库
有关使用Redis对并发控制的实战解决方案
设计模式
数据库
数组
学习依赖注入与控制反转
多线程
泛型是JDK1.5版本中加入的,在没有泛型以前,从集合中读取到的每个对象都必须进行转化。若是有有人不当心插入了类型错误的对象,在运行时的转化处理就会出错。有了泛型以后,能够告诉变一块儿每一个集合中接受那些对象类型。编译器自动地为你的插入进行转化,并在编译时告知是否插入了类型错误的对象。
关于 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 );
线程池的核心线程数。在没有设置 allowCoreThreadTimeOut 为 true 的状况下,核心线程会在线程池中一直存活,即便处于闲置状态。
线程池所能容纳的最大线程数。当活动线程 (核心线程 + 非核心线程) 达到这个数值后,后续任务将会根据 RejectedExecutionHandler 来进行拒绝策略处理。
非核心线程
闲置时的超时时长。超过该时长,非核心线程就会被回收。若线程池经过allowCoreThreadTimeOut()
方法设置 allowCoreThreadTimeOut 属性为 true,则该时长一样会做用于核心线程,AsyncTask 配置的线程池就是这样设置的。
keepAliveTime 时长对应的单位。
线程池中的任务队列,经过线程池的 execute() 方法提交的 Runnable 对象会存储在该队列中。
线程工厂,功能很简单,就是为线程池提供建立新线程的功能。这是一个接口,能够经过自定义,作一些自定义线程名的操做。
当任务没法被执行时 (超过线程最大容量 maximum 而且 workQueue 已经被排满了) 的处理策略,这里有四种任务拒绝类型。
任务队列 workQueue 是用于存放不能被及时处理掉的任务的一个队列,它是
一个 BlockingQueue 类型。
关于 BlockingQueue,虽然它是 Queue 的子接口,可是它的主要做用并非容器,而是做为线程同步的工具,他有一个特征,当生产者试图向 BlockingQueue 放入 (put) 元素,若是队列已满,则该线程被阻塞;当消费者试图从 BlockingQueue 取出 (take) 元素,若是队列已空,则该线程被阻塞。(From 疯狂 Java 讲义)
当线程池中的数量等于最大线程数时抛 java.util.concurrent.RejectedExecutionException 异常,涉及到该异常的任务也不会被执行,线程池默认的拒绝策略就是该策略。
当线程池中的数量等于最大线程数时, 默默丢弃不能执行的新加任务,不报任何异常。
当线程池中的数量等于最大线程数时,重试添加当前的任务;它会自动重复调用 execute()方法。
当线程池中的数量等于最大线程数时, 抛弃线程池中工做队列头部的任务(即等待时间最久的任务),并执行新传入的任务。
本文将详细分析 ThreadPoolExecutor 的实现原理,并结合源码介绍 ThreadPoolExecutor 的重要操做,对理解 ThreadPoolExecutor 很是有帮助。本文中源码基于 JDK1.7
本文详细解释了运用反射进行代码编写时遭遇到的各类常见的 Exception,以及使用反射时须要注意的一些细节问题。
ThreadPoolExecutor线程池
分析线程池源码
代理模式是java中最经常使用的设计模式之一,尤为是在spring框架中普遍应用。对于java的代理模式,通常可分为:静态代理、动态代理、以及CGLIB实现动态代理。对于上述三种代理模式,分别进行说明。
专栏 | 九章算法 网址 | www.jiuzhang.com 最少操做数使数组元素相等 I 题目描述 给定一个长度为n的非空整数数组,找出使数组全部元素均相等的最少操做数,其中一次操做将其中n-1个数加上1。 样例 输入: [1,2,3] 输出: 3 说明: 最少3次操做到达…
主要是对hash算法中运用到的知识进行进一步的解析,帮助初学者进一步揭开hash算法的神秘面纱。