线程池ThreadPool的实现符合生产者-消费者模型,这个模型解除生产者消费者间的耦合关系,生产者可以专注处理制造产品的逻辑而不用关心产品的消费,消费者亦然。当然,生产者消费者之间需要一个连接的纽带,那就是产品接口。产品接口是对这两者的约束,生产者生产的产品要符合产品的接口,消费者依据产品接口来消费。

Thread类是ThreadPool中的消费者,它封装pthread API函数,对外提供Thread::entry()作为线程的入口函数。Thread只是对消费者的抽象,WorkThread才是ThreadPool的具体消费者,它实现Thread接口函数,设置线程的入口函数为ThreadPool的worker()方法。

WorkQueue_类在ThreadPool中代表产品接口,对外表现为一个队列,队列中存储待处理的数据元素。消费者WorkThread对它的处理主要分成三个步骤:首先调用_void_dequeue()方法获取队列元素,然后通过_void_process()方法处理元素,最后使用_void_process_finish()方法进行收尾工作。具体调用过程可以参看WorkTread的线程入口函数,也就是ThreadPool::work()方法。

template<typename T, typename U=T>
class WorkQueueVal: public WorkQueue_{
virtual void _enqueue(T) = 0;
virtual U _dequeue() = 0; // 向WorkQueueVal加入的元素的类型为T,而读出的元素的类型为U。
};

WorkQueueVal<T,U>是WorkQueue的纯虚子类。它包含两个列表,一个为to_process用于保存待处理的元素,另一个为to_finish用于保存已经处理过的元素。在_void_dequeue()时从其子类中取出元素放入to_process列表,以便在_void_process()时从中取出元素进行处理,并把处理后的元素放入to_finish列表。最后,在ThreadWork线程调用_void_process_finish()函数时,从to_finish列表中取出元素做最后的处理。此外,需要注意的是WorkQueueVal<T, U>添加元素时使用的类型是T,而读取元素时的类型变成了U,需要子类自己负责转换。或许,这就是WorkQueueVal<T, U>类的设计目的。

Ceph剖析:线程池实现的更多相关文章

  1. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  2. java多线程详解(7)-线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, 这样频繁创建线程就会大大降低系 ...

  3. java并发编程(4)--线程池的使用

    转载:http://www.cnblogs.com/dolphin0520/p/3932921.html 一. java中的ThreadPoolExecutor类 java.util.concurre ...

  4. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  5. Java 线程池的使用

    转载原文链接: http://www.cnblogs.com/dolphin0520/p/3932921.html 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有 ...

  6. java并发编程-线程池的使用

    参考文章:http://www.cnblogs.com/dolphin0520/p/3932921.html 深入剖析线程池实现原理 将从下面几个方面讲解: 1.线程池状态 2.任务的执行 3.线程池 ...

  7. java线程池的使用与详解

    java线程池的使用与详解 [转载]本文转载自两篇博文:  1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html   ...

  8. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  9. Java并发编程:Java线程池

    转载自:http://www.cnblogs.com/dolphin0520/p/3932921.html 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题 ...

  10. Java线程池(ThreadPool)详解

    线程五个状态(生命周期): 线程运行时间 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间.    如果:T1 + T3 远大于 T2,则可以 ...

随机推荐

  1. Linux下apache+phppgadmin+postgresql安装配置

    Linux下apache+phppgadmin+postgresql安装配置 操作系统:CentOS 安装包:httpd(首选yum), php(包括php以及php-pgsql,php-mbstri ...

  2. PHPCMS V9 分页类的修改教程

    首先,打开 phpcms\libs\functions\global.func.php 这个文件,找到文件第622行的分页函数,复制一下,粘贴到默认分页函数的下面,重新命名后保存.(笔者在此命名为:p ...

  3. SSM项目配置随笔

    一.自动扫描 使用Annotation自动注册Bean:在主容器中不扫描@Controller注解,在SpringMvc中只扫描@Controller注解. 1.spring配置文件(扫描注解) &l ...

  4. XML.01-语法简介

    body,td { font-family: calibri; font-size: 10pt }   XML.01-语法简介 文档声明 元素(标签) 属性 注释 特殊字符 CDATA区域 处理指令 ...

  5. linux 学习10 shell 基础

    10.1 Shell概述 .Shell是什么 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至是编写一 ...

  6. Activex、OLE、COM、OCX、DLL之间的区别(转)

    熟悉面向对象编程和网络编程的人一定对ActiveX.OLE和COM/DCOM这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多们还是比较模糊的.在具体介绍它们的关系之间,我们还是先明确组件(Co ...

  7. springmvc spring mybatis插入mysql中文乱码

    springmvc 插入mysql数据库中文乱码问题: 1.将页面中的编码改成utf-8 2.用SQLyog右击->改变数据库 以上两步可以保证页面数据编码一致 3.在mybatis连接的地方加 ...

  8. 一步一步学WebSocket(二) 使用SuperWebSocket实现自己的服务端

    上一篇文章,我们了解了客户端如何与服务器创建WebSocket连接.但是一个巴掌拍不响,既然是通信,就必然最少要有两个端.今天我们来看看c#如何用已有的框架实现一个WebSocket服务端. 在.Ne ...

  9. tablediff使用方法

    tablediff -sourceserver "db0093\sql2008" -sourcedatabase "testly" -sourcetable & ...

  10. jquery 原理

    /* * my-jquery-1.0 *//* * 网上也有很多实现的版本,不过这是我在我自己的理解下写的,加上注释,希望可以解释清楚.*//* * 整个jquery包含在一个匿名函数中,专业点叫闭包 ...