定义:通过将多个并发的任务存入队列实现任务的串行化,并为这些串行化的任务创建唯一的一个工作者线程进行处理
由于只有唯一的工作者线程访问,对其的访问无须加锁,因此避开了锁的的开销和锁带来的问题
![](https://img-blog.csdnimg.cn/20190608132816402.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTAxNDUyMTk=,size_16,color_FFFFFF,t_70)
Serializer: 负责对外暴露服务接口以及工作者线程的生命周期管理,并将客户端对其的并发任务调用转换为相应的任务以实现服务串行化
service: 表示将串行线程封闭模式对外暴露的服务方法,该方法将客户端对其的并发调用串行化
init: 初始化串行线程封闭模式对外暴露的服务,该方法启动工作者线程
shutdown: 停止线程串行模式对外暴露的服务,该方法停止工作者线程
WorkerThread: 工作者线程,负责接收Serializer提交的并发任务以及这些任务的执行
submit: 用于Serializer提交并发任务,并将这些任务串行化
dispatch: 用于执行串行化的任务
Queue: Serializer和WorkerThread间的缓冲区,用于实现并发任务的串行化
enqueue: 用于并发任务入队列
dequeue: 用于任务出队列
NonThreadSafeObject: 工作者线程执行任务时所需访问的非线程安全对象
需要下载一批文件,但是不希望是建立大量的网络连接,因为大量的网络IO会增加系统负担,此时可以将并行任务串行化。这种情况可以考虑使用队列,下列代码使用阻塞队列ArrayBlockingQueue,将任务一个一个取出来处理,同时也避免额外增添锁的使用,减小开销。事实上,ArrayBlockingQueue内部中使用了ReentrantLock来实现阻塞,保证了串行化,同时也保证了线程安全。
package com.bruce.serialThreadConfinement;
import com.bruce.twoPhaseTermination.AbstractTerminatableThread;
import org.apache.commons.net.ftp.FTP;
imp