并发编程 | 003-解释线程池各个参数的含义
面试中非常高频的一个面试题:解释一下线程池中各个参数的含义。 这是一个非常常见但是却会卡死一大堆人的一道面试题,能够细致的了解线程池的各个参数的含义对我们学习线程池和使用线程池有着巨大的好处的。 首先我们来看一下线程池主要的参数: 参数名 参数含义 corePoolSize 核心线程数 maxinumPoolSize 最大线程数 keepAliveTime 空闲线程存活时间 unit 存活时间的单位 workQueue 存放线程任务队列 threadFactory 线程工厂,创建新线程 handler 线程池拒绝处理后的任务 上面展示的参数中第三个和第四个参数算是一个,时间和单位的组合 corePoolSize 代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后并不会消除,而是一种常驻线程 maxinumPoolSize 代表的是最大线程数,它与核心线程数相对应,表示最大允许被创建的线程数,比如当前任务较多,将核心线程数都用完了,还无法满足需求时,此时就会创建新的线程,但是线程池内线程总数不会超过最大线程数 keepA ...
并发编程 | 002-一文读懂线程六种状态的转换
在我们接触编程时,就开始接触各种生命周期,比如对象的生命周期,程序的生命周期等等,对于线程来说也是存在自己的生命周期,而且这也是面试与我们深入了解多线程必备的知识,今天我们主要介绍线程的生命周期及其各种状态的转换。 线程的六种状态线程的生命周期主要有以下六种状态: New(新创建) Runnable(可运行) Blocked(被阻塞) Waiting(等待) Timed Waiting(计时等待) Terminated(被终止) 在我们程序编码中如果想要确定线程当前的状态,可以通过 getState() 方法来获取,同时我们需要注意任何线程在任何时刻都只能是处于一种状态。 New 新建状态 首先我们展示一下整个线程状态的转换流程图,下面我们将进行详细的介绍讲解,如下图所示,我们可以直观的看到六种状态的转换,首先左侧上方是 NEW 状态,这是创建新线程的状态,相当于我们 new Thread() 的过程。 New 表示线程被创建但尚未启动的状态:当我们用 new Thread() ...
并发编程 | 001-如何优雅的停止一个线程?
在之前的文章中 i-code.online -《并发编程-线程基础》我们介绍了线程的创建和终止,从源码的角度去理解了其中的细节,那么现在如果面试有人问你 “如何优雅的停止一个线程?”, 你该如何去回答尼 ?能不能完美的回答尼? 对于线程的停止,通常情况下我们是不会去手动去停止的,而是等待线程自然运行至结束停止,但是在我们实际开发中,会有很多情况中我们是需要提前去手动来停止线程,比如程序中出现异常错误,比如使用者关闭程序等情况中。在这些场景下如果不能很好地停止线程那么就会导致各种问题,所以正确的停止程序是非常的重要的。 强行停止线程会怎样? 在我们平时的开发中我们很多时候都不会注意线程是否是健壮的,是否能优雅的停止,很多情况下都是贸然的强制停止正在运行的线程,这样可能会造成一些安全问题,为了避免造成这种损失,我们应该给与线程适当的时间来处理完当前线程的收尾工作, 而不至于影响我们的业务。 对于 Java 而言,最正确的停止线程的方式是使用 interrupt。但 interrupt 仅仅起到通知被停止线程的作用。而对于被停止的线程而言,它拥有完全的自主权,它既可 ...
并发编程 | 000-多线程基础
1. 线程的创建首先我们来复习我们学习 java 时接触的线程创建,这也是面试的时候喜欢问的,有人说两种也有人说三种四种等等,其实我们不能去死记硬背,而应该深入理解其中的原理,当我们理解后就会发现所谓的创建线程实质都是一样的,在我们面试的过程中如果我们能从本质出发回答这样的问题,那么相信一定是个加分项!好了我们不多说了,开始今天的 code 之路 1.1 继承 Thread 类创建线程 这是我们最常见的创建线程的方式,通过继承 Thread 类来重写 run 方法, 代码如下: 123456789101112131415161718192021/** * 线程类 * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */public class ThreadDemo extends Thread { @Override public void run() { //线程执行内容 while (true){ try { ...
JVM专题 | 000-下载JDK 与 Hotspot 虚拟机源码
下载 jdk 源码,与 jvm 虚拟机源码,虚拟机现在主流都是 hotspot 虚拟机 首先进入 openjdk 官方网站 http://openjdk.java.net/ ,这个网站中我们可以下载 jdk 源码,也可以下载 hotspot 虚拟机的源码 首先我们进入 Mercurial 菜单下,这是一个版本控制器类似 git 、 SVN 之类 如上图所示,我们可以看到上面列了很多项目,我们这里选择 jdk8u 的项目进入 进入后可以直接在线看,也可以直接下载压缩包,这里推荐下载压缩包,本地来查看 下载后解压,使用编辑器即可进行查看,比如使用 vscode 软件直接查阅,之后文章会介绍关于 jdk 源码在本地编译构建的内容 document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } ...
ELK专题 | 000-Java操作Elasticsearch 之 [Java High Level REST Clientedit]
Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json
Spring系列(7)-IoC 之解析 import 标签
在上一文中我们分析了注册 BeanDefinition 的过程,在其中我们了解到在解析跟节点和子节点时分两种情况,对于默认名称空间的标签我们通过 DefaultBeanDefinitionDocumentReader#parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) 进行处理,而对于自定义标签则通过 BeanDefinitionParserDelegate#parseCustomElement(Element ele) 方法进行处理。这里我们首先对默认名称空间的解析进行开始解读, #parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) 方法的代码如下: 1234567891011121314151617181920212223242526272829303132public static final String NESTED_BEANS_ELEMENT = "beans";public static ...
从零开始学习Spring Data Jpa [1]
本文主要讲解 springData Jpa 入门相关知识, 了解JPA规范与Jpa的实现,搭建springboot+dpringdata jpa环境实现基础增删改操作,适合新手学习,老鸟绕道~ 1. ORM 概论ORM(Object-Relational Mapping)顾名思义就是表示对象关系映射。在面向对象的软件开发中,我们肯定是需要和数据库进行交互的,那么这里就存在一个问题如何将数据库中的表与我们代码中的对象映射起来尼,我们只要有一套程序能够做到 建立对象与数据库的关,操作对象就可以直接操作数据库数据,就可以说这套程序实现了ORM对象关系映射 简单的说:ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。目前市面上主流的ORM框架有Hibernate、Mybatis、Spring Data Jpa等, 其中 Mybatis 框架是一个半自动的ORM框架,本身并不是完全面向对象的思想,但是得益于sql与代码的解耦,可以更灵活的操作sql与优化sql,但是同时也带有复杂的映射文件,在国内目前还是非常主流的。 Hibernate 是一款完全开 ...
Spring系列(6)-Spring之Document获取
1. 引入之前文章中我们分析了BeanDefinition的加载,其中在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader#doLoadBeanDefinitions(...) 方法中有一个操作 doLoadDocument(inputSource, resource) , 这里是将 inputstream 转换为 xml document , 方法的具体实现如下: 123456protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception { //getValidationModeForResource是数据验证模型 //加载 inputsteam 中 解析出document对象 return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler, getV ...
Spring系列(5)-Springioc之验证模型获取
我们上一篇文章最后调用到 `org.springframework.beans.factory.xml. XmlBeanDefinitionReader#doLoadDocument(…) ` 方法,该方法主要代码如下: 12345protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception { //getValidationModeForResource是数据验证模型 return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler, getValidationModeForResource(resource), isNamespaceAware()); } 我们这篇文章主要以 #getValidationModeForResource(...) 方法作为切入,来分析一下验证模型的主要方法,关于spring中的数据验证、绑定等内容我 ...