线程池,首先要明白,线程池是用来管理线程类的,线程类的实现可以参考我前面说过的方法,连接:
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;
}
}
相关推荐
在stmF4上实现了线程池, 工作队列, 延时队列,周期性任务,延时任务 你无需为工程创建多少个临时线程而烦恼
线程池是多线程编程中一个重要的概念,它能够优化系统资源的使用,提高系统的响应速度和效率。本篇文章将深入探讨C++中的线程池实现,并通过名为“OEasyPool-1.0”的示例来展示其工作原理。 线程池是预先创建并维护...
在C++编程中,线程池是一种管理线程资源的有效方式,它可以帮助开发者优化多线程应用程序的性能,减少线程创建和销毁的开销。本文将深入探讨线程池的概念、工作原理以及如何在C++中实现一个高效的线程池。 线程池的...
线程池是多线程编程中的一个重要概念,它是一种线程使用模式,通过预先创建一定数量的线程来处理任务,而不是每当有新任务提交时就创建新的线程。线程池的使用可以有效地减少系统资源的消耗,提高系统的响应速度和...
线程池是多线程编程中的一个重要概念,它是一种线程使用模式,通过预先创建一组线程并维护一个线程集合来处理并发任务。在Windows操作系统中,内建的线程池API(Thread Pool API)提供了高效且灵活的线程管理机制,...
线程池是一种多线程处理形式,通过预先创建一定数量的线程并管理它们,以提高系统的效率和响应性。在计算机科学中,特别是在软件开发领域,线程池是操作系统或者编程语言中的一种资源管理技术。它允许程序预先启动一...
corePoolSize:核心池的大小,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中; ...
Kotlin线程池(单线程池、固定线程池、缓存线程池,定时+周期任务线程池)的封装
完整线程池一系列基本操作包括添加,删除,投入执行任务
简单实现了线程池的框架构建,并简单进行了测试。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
### 深入理解Java之线程池 #### 一、Java中的`ThreadPoolExecutor`类 在Java中,`ThreadPoolExecutor`是线程池的核心实现类之一,它提供了丰富的配置选项来满足不同的应用场景需求。该类继承自`...
搞懂Java线程池 Java线程池是Java编程中非常重要的知识点,多线程并发算是Java进阶的知识,用好多线程不容易有太多的坑。在Java中,创建线程是一个“重”操作,需要调用操作系统内核API,然后操作系统再为线程分配...
在Android开发中,线程池是一种管理线程的机制,它可以帮助我们更高效地调度并发任务,优化系统资源的使用,防止过多线程导致的系统性能下降或崩溃。本篇文章将深入探讨四种主要的线程池类型及其实现,旨在帮助...
Java线程池框架是Java并发处理的核心工具,它允许开发者高效地管理多个并发任务,避免了频繁创建和销毁线程的开销。线程池通过维护一组可重用的线程来提高系统的性能和响应性。本文将深入探讨Java线程池的结构、常见...
在Android系统中,Binder是进程间通信(IPC)的核心机制,而线程池则是多线程编程中的一个重要概念。这个“binder线程池demo”是基于《开发艺术探索》一书中的示例,旨在帮助开发者理解如何在Android环境中有效地...
在处理大量数据导入数据库的场景中,使用阿里巴巴开源的EasyExcel库结合线程池技术可以有效地实现从Excel文件导入到数据库的过程。先定义sheet的数量和固定大小的线程池数量,每个sheet页做为单独的任务交给线程池...
线程池是一种多线程处理形式,通过维护一组可重用线程来处理并发任务,而不是为每个新任务创建新的线程。在Qt框架中,线程池是通过`QThreadPool`类实现的,它提供了方便的方式来管理和调度线程。在本项目中,"线程池...
线程池是现代操作系统中一个重要的并发编程概念,它在Windows操作系统中被广泛使用,以提高系统资源的利用率和性能。线程池是由操作系统维护的一组预创建的线程,这些线程可供多个任务共享,而不是为每个任务创建新...
### Python 实现线程池的方法 #### 一、线程池的基本概念 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效控制运行的线程数量,如果线程数量超过了...