`
konin
  • 浏览: 10342 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

线程池

阅读更多

线程池,首先要明白,线程池是用来管理线程类的,线程类的实现可以参考我前面说过的方法,连接:

 http://konin.iteye.com/blog/2333332

既然是管理线程类,就必须要有一个容器(池子)来装这些线程类,同时间,要知道有那些线程类处于运行工作的状态,所以还要有一个容器装运行状态的线程

 

什么情况下需要用到线程池?

场景1、一个业务,可以通过某种规则,用多个线程来处理,而这些线程可以分别独立处理这个业务而不互相干扰,比如1000万条记录,每条记录的关键字段是数字,数字分别以0到9结尾,那么就可以用10个线程来处理,用一个线程池来管理这10个线程。

 

实现步骤 声明:

class ThreadPool {
public:
    /**
     * 线程列表类型
     */
    typedef set<Thread*> ThreadSet;

    /**
     * 构造函数
     */
    ThreadPool();

    /**
     * 析构函数
     */
    virtual ~ThreadPool();

    /**
     * 添加线程对象
     * @param thread 线程对象, 由ThreadPool负责释放
     */
    void addThread(Thread* thread);

    /**
     * 获取线程集合
     */
    const ThreadSet& getThreadSet() const;

    /**
     * 运行线程池里的线程
     * @return 实际运行线程数, 0表示没有运行任何线程
     */
    int start();

    /**
     * 等待已经运行的线程完成运行
     * @return 结束的线程数
     */
    int join();

    /**
     * 清空线程池
     */
    void clear();

protected:
    /**
     * 添加线程
     */
    void doAddThread(Thread* thread);

    /**
     * 运行线程实现
     */
    int doStart(int n);

    ThreadSet   _threads;
    ThreadSet   _runningThreads;
    Mutex       _mutex;
};

 

实现

ThreadPool::ThreadPool() {}

ThreadPool::~ThreadPool() {
    join();

    clear();
}

void ThreadPool::addThread(Thread* thread) {
    LockGuard<Mutex> guard(_mutex);
    (void)guard;

    doAddThread(thread);
}

const ThreadPool::ThreadSet& ThreadPool::getThreadSet() const {
    return _threads;
}

void ThreadPool::doAddThread(Thread* thread) {
    _threads.insert(thread);
}

int ThreadPool::start() {
    LockGuard<Mutex> guard(_mutex);
    (void)guard;

    return doStart(static_cast<int>(_threads.size()));
}

int ThreadPool::doStart(int n) {
    int i = 0;
    for (ThreadSet::const_iterator iter = _threads.begin(); n >= 0 && iter != _threads.end(); ++iter) {
        (*iter)->start();
        _runningThreads.insert(*iter);
        ++i;
        --n;
    }
    return i;
}

int ThreadPool::join() {
    LockGuard<Mutex> guard(_mutex);
    (void)guard;

    int n = static_cast<int>(_runningThreads.size());
    while (!_runningThreads.empty()) {
        ThreadSet::iterator iter = _runningThreads.begin();
        (*iter)->join();
        _runningThreads.erase(iter);
    }
    return n;
}

void ThreadPool::clear() {
    for (ThreadSet::const_iterator iter = _threads.begin(); iter != _threads.end(); ++iter) {
        delete *iter;
    }
}

 

 

 

分享到:
评论

相关推荐

    freertos线程池

    在stmF4上实现了线程池, 工作队列, 延时队列,周期性任务,延时任务 你无需为工程创建多少个临时线程而烦恼

    c++ 多线程线程池 demo

    线程池是多线程编程中一个重要的概念,它能够优化系统资源的使用,提高系统的响应速度和效率。本篇文章将深入探讨C++中的线程池实现,并通过名为“OEasyPool-1.0”的示例来展示其工作原理。 线程池是预先创建并维护...

    c++ 线程池

    在C++编程中,线程池是一种管理线程资源的有效方式,它可以帮助开发者优化多线程应用程序的性能,减少线程创建和销毁的开销。本文将深入探讨线程池的概念、工作原理以及如何在C++中实现一个高效的线程池。 线程池的...

    线程池代码

    线程池是多线程编程中的一个重要概念,它是一种线程使用模式,通过预先创建一定数量的线程来处理任务,而不是每当有新任务提交时就创建新的线程。线程池的使用可以有效地减少系统资源的消耗,提高系统的响应速度和...

    windows线程池,使用Windows自带的线程池api功能,比你写的线程池性能好得多

    线程池是多线程编程中的一个重要概念,它是一种线程使用模式,通过预先创建一组线程并维护一个线程集合来处理并发任务。在Windows操作系统中,内建的线程池API(Thread Pool API)提供了高效且灵活的线程管理机制,...

    线程池  

    线程池是一种多线程处理形式,通过预先创建一定数量的线程并管理它们,以提高系统的效率和响应性。在计算机科学中,特别是在软件开发领域,线程池是操作系统或者编程语言中的一种资源管理技术。它允许程序预先启动一...

    java线程池概念.txt

    corePoolSize:核心池的大小,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中; ...

    Kotlin线程池(单线程池、固定线程池、缓存线程池,定时+周期任务线程池)的封装

    Kotlin线程池(单线程池、固定线程池、缓存线程池,定时+周期任务线程池)的封装

    线程池源码

    完整线程池一系列基本操作包括添加,删除,投入执行任务

    线程池管理

    简单实现了线程池的框架构建,并简单进行了测试。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    线程池java

    ### 深入理解Java之线程池 #### 一、Java中的`ThreadPoolExecutor`类 在Java中,`ThreadPoolExecutor`是线程池的核心实现类之一,它提供了丰富的配置选项来满足不同的应用场景需求。该类继承自`...

    搞懂Java线程池

    搞懂Java线程池 Java线程池是Java编程中非常重要的知识点,多线程并发算是Java进阶的知识,用好多线程不容易有太多的坑。在Java中,创建线程是一个“重”操作,需要调用操作系统内核API,然后操作系统再为线程分配...

    android线程池

    在Android开发中,线程池是一种管理线程的机制,它可以帮助我们更高效地调度并发任务,优化系统资源的使用,防止过多线程导致的系统性能下降或崩溃。本篇文章将深入探讨四种主要的线程池类型及其实现,旨在帮助...

    Java 线程池框架

    Java线程池框架是Java并发处理的核心工具,它允许开发者高效地管理多个并发任务,避免了频繁创建和销毁线程的开销。线程池通过维护一组可重用的线程来提高系统的性能和响应性。本文将深入探讨Java线程池的结构、常见...

    binder线程池demo

    在Android系统中,Binder是进程间通信(IPC)的核心机制,而线程池则是多线程编程中的一个重要概念。这个“binder线程池demo”是基于《开发艺术探索》一书中的示例,旨在帮助开发者理解如何在Android环境中有效地...

    通过EasyExcel+线程池实现百万级数据从Excel导入到数据库

    在处理大量数据导入数据库的场景中,使用阿里巴巴开源的EasyExcel库结合线程池技术可以有效地实现从Excel文件导入到数据库的过程。先定义sheet的数量和固定大小的线程池数量,每个sheet页做为单独的任务交给线程池...

    线程池模块实现

    线程池是一种多线程处理形式,通过维护一组可重用线程来处理并发任务,而不是为每个新任务创建新的线程。在Qt框架中,线程池是通过`QThreadPool`类实现的,它提供了方便的方式来管理和调度线程。在本项目中,"线程池...

    Windows自带的线程池的实现

    线程池是现代操作系统中一个重要的并发编程概念,它在Windows操作系统中被广泛使用,以提高系统资源的利用率和性能。线程池是由操作系统维护的一组预创建的线程,这些线程可供多个任务共享,而不是为每个任务创建新...

    python实现线程池的方法

    ### Python 实现线程池的方法 #### 一、线程池的基本概念 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效控制运行的线程数量,如果线程数量超过了...

Global site tag (gtag.js) - Google Analytics