线程池有以下几个部分:
1.完成主要任务的一个或多个线程.
2.用于调度管理的管理线程.
3.要求执行的任务队列.
一个线程池至少应该具有以下几个方面的功能:
1.提供一个任务接口以便用户加入任务
这里需要有两个组件,一是规定操作的任务接口:
interface ITask{
public void task();
}
一是存放操作的容器.容器可以根据调度策略来选择或自己实现,比如一个最简单的FIFO策略的容器
可以用LinkedList来实现.需要注意的是对这个容器的存取需要同步:
class TaskList{
private LinkedList<ITask> tl = new LinkedList();
public synchronized void addTask(ITask task){
this.tl.add(task);
//notifyAll();
}
//加上addFistTask和addLastTask
public synchronized ITask getTask(){
if(this.size() <= 0)
wait();
return this.tl.poll();
}
//加上getFistTask和getLastTask
public synchronized int getCount(){
return this.tl.size();
}
public synchronized void removeAll(){
this.tl.clear();
}
}
加上addFistTask和addLastTask, getFistTask和getLastTask实现就可以实现简单的优先级调度.
2.工作线程
我们把用来执行用户任务的线程称为工作线程,工作线程就是不断从队列中获取任务对象并执行对象
上的业务方法:
class WorkThread extends Thread{
private TaskList list;
//多个工作线程共同从一个任务队列中获取任务,所以要从外面传入一个任务队列.
public WorkThread(String name,TaskList list){
super(name);
this.list = list;
}
public void run(){
while(true){
ITask task = null;
task = list.getTask();
if(task != null) task.task();
}
}
}
这里还需要加入对线线程状态的判断.
然后需要有一个对工作线程的调度线程.完成以下几个功能:
1.生成需要的工作线程.由于创建线程需要一定的开销,一定要注意所创建的所有线程不能超一个设定
的最大值.建议最大值不要超25.
2.动态自适应调整集合中线程数.当有太多的线程处于闲置状态时(队列中没有任务),应该按一定比例
销毁闲置了一定时的线程.如果队列中任务队列积压太多而工作线程总数没有超最大线程数时应该及时
创建工作线程直至达到是大值.
3.需要一个专门的后台线程定时扫描队列中任务与正在工作的线程总数,闲置的线程总数.
以上功能有不同优化方法实现,可以参考JDK的线程池实现.
分享到:
相关推荐
Windows下一个比较完美的线程池实现和示例 本线程池提供了如下功能: 1.能根据任务个数和当前线程的多少在最小/最大线程个数之间自动调整(Vista后的系统有 SetThreadpoolThreadMaximum 等函数有类似功能); 2.能方便...
主要介绍了Django异步任务线程池实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
这是一个很简单的线程池实现 适合刚开始研究线程池的朋友
C语言线程池实现实例
socket服务端线程池实现 不依赖于第三方jar,基于jdk编写。
前段时间发布了《Windows下一个比较完美的线程池实现和示例》(http://download.csdn.net/detail/fishjam/5106672),根据下载量和评论来看,对大家还比较有用。 现在发布一个利用该线程池实现的Http上传下载实现,...
>1、包含几乎所有redis线程池实现以及用法; >2、包含redis Master Slave 主备实现; >3、包含redis 读写分离; >4、包含redis Sentinel 线程池; >5、包含redis Sentinel Salve 线程池; >6、新增线程池对...
简易的C++11线程池实现,线程池为固定方式,后面会新增非固定模式。
Java版线程池实现
该文档为c++开发的线程池,可以作为参考
该程序实现了使用线程池实现文件目录的拷贝,其中含有完整的make脚本程序,可执行文件
C++线程池实现 vc2015编译
在处理大量数据导入数据库的场景中,使用...通过以上步骤,可以利用EasyExcel和线程池实现百万级数据从Excel导入到数据库的功能。这种方式可以提高数据处理的效率,减少内存占用,并且能够更好地利用多核CPU的优势。
服务器端,使用epoll加线程池实现并发服务器,接收客户端指令。客户端使用TCP连接到服务器,实现查询单词及历史记录的功能。服务器端查询单词使用标准IO读取词典文件实现。
小型线程池实现代码
java聊天室,利用线程池实现多用户聊天室
企业级跨平台C++线程池实现,带vs工程例子,易于使用,功能完善,经过企业级的线上测试的C++线程池实现。
NULL 博文链接:https://hoochiang.iteye.com/blog/2357124
Delphi线程池实现多线程FTP分段下载组件 by :renshouren mail:114032666@qq.com QQ:114032666 2019.10.05 使用的组件 1、TIdFTP Indy FTP客户端 2、TThreadsPool 线程池 工作原理及流程 调用本单元,将自动在程序...