深入研究Java阻塞队列实现

Java线程池分析

基于ThreadPoolExecutor构造线程池

我们来看一下ThreadPoolExecutor类的构造函数,一共需要传入7个参数,下面的注释中有详细的解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
//先判断参数是否合法
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
//核心线程数量
this.corePoolSize = corePoolSize;
//最大线程数量
this.maximumPoolSize = maximumPoolSize;
//工作队列
this.workQueue = workQueue;
//保活时间,unit为时间单位,转换为秒
this.keepAliveTime = unit.toNanos(keepAliveTime);、
//线程工厂
this.threadFactory = threadFactory;
//拒绝策略
this.handler = handler;
}

工作队列使用的是一种阻塞队列,关于阻塞队列的实现我将会在另一片文章中详细讲解

深入理解Java SPI机制

SPI的全名为Service Provider Interface,在java.util.ServiceLoader的文档:https://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html中有比较详细的介绍。究其思想,其实和Callback差不多。Callback的思想是我们在调用API的时候,我们可以写入一段逻辑代码传到API里面,API内部在合适的时候会调用它,从而实现某种程度上的“定制”。

典型的是Collections.sort(List<T> list,Comparator<? super T> c)这个方法,它的第二个参数是一个实现Comparator接口的实例。我们可以根据自己的排序规则写一个类,实现此接口,传入此方法,那么这个方法就会根据我们的规则对list进行排序。

Java SPI的具体约定如下

当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。

基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。

JDK提供服务实现查找的一个工具类:java.util.ServiceLoader

User Thread and Daemon Thread in Java

在Java当中有两种线程,一种是User Thread,另一种是Daemon Thread。一般来说User Thread具有较高的优先级,它主要运行在前台,然而,Daemon Thread具有较低的优先级,主要运行在后台。

User Thread

User Thread通常由应用或者用户创建的,JVM Instance等待所有的User Thread执行完成Tasks,直到所有的User Thread执行完成JVM才会退出。

Daemon Thread

Daemon Thread通常由JVM创建, 这些线程在后台运行,运行一些后台任务(包括,垃圾回收、内务任务等)。JVM 不会等待所有的Daemon Thrad执行完Tasks,只要所有的User Thread执行完Tasks,JVM就会退出。

Java NIO and BIO

Java NIO and BIO

我们都知NIO是非阻塞IO,BIO是阻塞IO,那到底什么是阻塞,什么是非阻塞呢,它们与同步/异步又有什么区别呢?先来了解一下阻塞/非阻塞,同步/异步的概念。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×