线程池技术简单实现
来源:互联网 发布:python微博爬虫实战 编辑:程序博客网 时间:2024/05/22 23:19
如上一篇数据库链接池看到,由于没有使用线程池技术,需要频繁的创建和销毁线程,这无疑十分消耗和浪费系统的资源,正式基于这个,我们可以探索,摸索线程池的原理,自己建立个简单的demo来解惑。
线程池接口
package chapter04.connection_pool.thread_pool;/** * Created by tianjun on 2017/11/4. */public interface ThreadPool<Job extends Runnable> { //执行一个Job,这个job需要实现Runnable void execute(Job job); //关闭线程池 void shutdown(); //增加工作者线程 void addWorkers(int num); //渐少工作者线程 void removeWorker(int num); //获得正在等待执行的任务数 int getJobSize();}
线程池实现
package chapter04.connection_pool.thread_pool;import java.util.*;import java.util.concurrent.atomic.AtomicLong;/** * Created by tianjun on 2017/11/4. */public class DefaultThreadPool<Job extends Runnable> implements ThreadPool<Job> { // 线程池最大限制数 private static final int MAX_WORKER_NUMBERS = 10; // 线程池默认的数量 private static final int DEFAULT_WORKER_NUMBERS = 5; // 线程池最小的数量 private static final int MIN_WORKER_NUMBERS = 1; // 这是一个工作列表,将会向里面插入工作 private final LinkedList<Job> jobs = new LinkedList<Job>(); // 工作者列表 private final List<Worker> workers = Collections.synchronizedList(new ArrayList<Worker>()); // 工作者线程的数量 private int workerNum = DEFAULT_WORKER_NUMBERS; // 线程编号生成 private AtomicLong threadNum = new AtomicLong(); public DefaultThreadPool() { initializeWokers(DEFAULT_WORKER_NUMBERS); } public DefaultThreadPool(int num) { workerNum = num > MAX_WORKER_NUMBERS ? MAX_WORKER_NUMBERS : num < MIN_WORKER_NUMBERS ? MIN_WORKER_NUMBERS : num; initializeWokers(workerNum); } public void execute(Job job) { if (job != null) { // 添加一个工作,然后进行通知 synchronized (jobs) { jobs.addLast(job); jobs.notify(); } } } public void shutdown() { for (Worker worker : workers) { worker.shutdown(); } } public void addWorkers(int num) { synchronized (jobs) { // 限制新增的Worker数量不能超过最大值 if (num + this.workerNum > MAX_WORKER_NUMBERS) { num = MAX_WORKER_NUMBERS - this.workerNum; } initializeWokers(num); this.workerNum += num; } } public void removeWorker(int num) { synchronized (jobs) { if (num >= this.workerNum) { throw new IllegalArgumentException("beyond workNum"); } // 按照给定的数量停止Worker int count = 0; while (count < num) { workers.get(count).shutdown(); count++; } this.workerNum -= count; } } public int getJobSize() { return jobs.size(); } // 初始化线程工作者 private void initializeWokers(int num) { for (int i = 0; i < num; i++) { Worker worker = new Worker(); workers.add(worker); Thread thread = new Thread(worker, "ThreadPool-Worker-" + threadNum.incrementAndGet()); thread.start(); } } // 工作者,负责消费任务 class Worker implements Runnable { // 是否工作 private volatile boolean running = true; public void run() { while (running) { Job job = null; synchronized (jobs) { // 如果工作者列表是空的,那么就wait while (jobs.isEmpty()) { try { jobs.wait(); } catch (InterruptedException ex) { // 感知到外部对WorkerThread的中断操作,返回 Thread.currentThread().interrupt(); return; } } // 取出一个Job job = jobs.removeFirst(); } if (job != null) { try { job.run(); } catch (Exception ex) { // 忽略Job执行中的Exception } } } } public void shutdown() { running = false; } }}
阅读全文
0 0
- 线程池技术简单实现
- 简单线程池实现
- 线程池简单实现
- 线程池技术个人理解以及c语言的简单实现
- 简单的线程池实现
- 线程池的简单实现
- 简单线程池的实现
- 线程池简单代码实现
- Python线程池简单实现
- 线程池的简单实现
- 简单的线程池实现
- 简单线程池的实现
- 线程池的简单实现
- C++实现简单线程池
- 简单线程池实现+测试
- 自实现简单线程池
- 简单线程池实现原理
- c++简单线程池实现
- 线程安全的对象生命周期管理
- pytorch学习-数据可视化
- ARM32/ARM64函数调用规则
- linux 虚拟机安装和配置
- EXT3日志文件系统之address_space_operation
- 线程池技术简单实现
- 程序猿你知道吗?写篇博客,给五块钱!
- eclipse的Java环境配置,Mac
- JPA
- sql 函数
- 例题 4-4 信息解码 (Uva 213)
- 什么是聚合支付,聚合支付有什么优势
- java 中数组存储结构讨论!
- AI | 深度学习之父Hinton推翻30年的研究成果 新“胶囊网络”或重建AI世界