工作中用到的线程池代码,单例模式写的,感觉不错.记下来.
public class ThreadPool{
//公用线程
public static final String commonThreads="commonThreads";
//公用线程个数
//TODO 可以配置
public static final int commonThreadCount=2;
//所有池列表
private static List<ThreadPool> pools=new LinkedList<ThreadPool>();
private static ThreadPool pool=null;
/**
* 线程池的唯一编号
*/
private String poolId="default Thread pool thread";
//----------------------
/**
* 任务队列
*/
private TaskQueue taskQueue=new TaskQueue();
/**
* 线程池中所有线程列表
*/
private List<PoolThread> threads=new LinkedList<PoolThread>();
private ThreadPool(int threadCount,String id) {
this.poolId=id;
this.init(threadCount);
}
private ThreadPool(int threadCount) {
this.init(threadCount);
}
private void init(int threadCount){
for(int i=0;i<threadCount;i++){
PoolThread poolThread=new PoolThread(this.taskQueue);
threads.add(poolThread);
poolThread.setDaemon(true);
poolThread.setName(poolId);
poolThread.start();
}
}
/**
* 添加一项任务到线程池
* @param runnable
*/
public void addTask(Runnable task){
this.taskQueue.addTask(task);
}
/**
* 获得指定ID的线程池对象,如果没创建,就创建,threadCount为对应线程池的线程个数
* @param poolId
* @param threadCount
* @return
*/
public static ThreadPool getInstance(String poolId,int threadCount){
ThreadPool pool=getPool(poolId);
if(pool==null){
pool=new ThreadPool(threadCount,poolId);
pools.add(pool);
}
return pool;
}
/**
* 返回指定ID的线程组,如果没有就返回空
* @param poolId
* @return
*/
public static ThreadPool getInstance(String poolId){
ThreadPool pool=getPool(poolId);
return pool;
}
/**
* 获得进行公共事务处理的线程
* @return
*/
public static ThreadPool getInstance(){
return getInstance(commonThreads, commonThreadCount);
}
/**
* 返回指定ID的线程池
* @param id
* @return
*/
private static ThreadPool getPool(String id){
ThreadPool ret=null;
int len=pools.size();
for(int i=0;i<len;i++){
ThreadPool pool=pools.get(i);
if(pool.getId().equals(id)){
ret=pool;
return ret;
}
}
return ret;
}
public String getId(){
return this.poolId;
}
}
class TaskQueue{
//任务链表
private List<Runnable> tasks=new LinkedList<Runnable>();
/**
* 添加一任务到队列
* @param task
*/
public synchronized void addTask(Runnable task) {
this.tasks.add(task);
if(this.getTaskCount()<=1){//有线程被挂起
// System.out.println("叫醒");
this.notify();
}
}
/**
* 当前线程将被挂起,直到有可用的任务到达
* @return
*/
public synchronized Runnable getTask(){
Runnable ret=null;
while(true){
if(this.getTaskCount()<=0){
try {
// System.out.println("wait......");
this.wait();
} catch (InterruptedException e) {}
}else{
ret=this.tasks.remove(0);
break;
}
}
return ret;
}
public synchronized int getTaskCount(){
return this.tasks.size();
}
}
/**
* 线程池中的线程
*
*
*/
class PoolThread extends Thread{
private TaskQueue queue;
PoolThread(TaskQueue queue){
this.queue=queue;
}
public void run(){
while(true){
Runnable run=queue.getTask();
run.run();
//HelperMethods.sleepThread();//让出处理器
}
}
}
}
}
分享到:
相关推荐
工作单元会被添加到线程池中,由线程池的工作线程进行处理。 `pthread_pool.cpp`文件则可能包含了线程池类的实现细节,例如如何初始化线程池、如何启动和停止工作线程、如何管理任务队列等。在Linux环境下,线程池...
java开发过程,经常会用到线程池技术,这里简单介绍一个构建线程池的实例
corePoolSize:核心池的大小,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中; ...
- 注意异常处理,确保线程池中的线程在出现异常时能正确关闭。 通过理解这些核心概念,你可以根据具体需求构建自己的线程池系统,利用MCPageCheck这样的组件来提升并发处理能力。在实际项目中,正确使用线程池可以...
线程池是一种线程使用模式,它预先创建了一组可重用的线程,当有任务需要执行时,不再直接创建新的线程,而是从线程池中取出一个空闲线程来执行任务,完成任务后线程返回到线程池而不是直接销毁。这样可以避免频繁地...
3. **任务调度**:线程池中的空闲线程会从任务队列中取出任务进行执行。 4. **线程复用**:执行完任务的线程不会立即销毁,而是回到等待队列中,准备执行下一个任务。 5. **动态调整**:根据系统负载和资源状况,...
讲述了java线程池的优点,参数,6种线程池的使用场景,线程池用到的handler,线程任务的提交方式等等。
为了在Boost线程池中使用OpenCV处理图像,你需要按照以下步骤操作: 1. **初始化线程池**:首先,创建一个Boost线程池实例,指定线程数量。这通常根据系统资源和任务需求来决定。 2. **定义任务**:编写一个函数或...
在描述中提到的双向循环链表是一种数据结构,用于存储线程池中的待处理任务。相比于数组,链表允许动态扩展,更灵活地插入和删除元素。在C语言中,双向循环链表通常包含节点结构体,每个节点包含数据域(例如任务...
从易语言转型到C#感觉C#自带的线程池不够灵活(或许是自己的技术不够),所以自己写了一个线程池工作类为了配合自己的使用习惯,有兴趣的可以下载参考 代码用到的是信号处理以及队列等一些比较基础的东西,已经测试了功能...
qt编写tcp服务器程序,用到线程池。在vs2010/qtcreator4.8下运行正常.
线程池是什么 QThreadPool 线程池是一种线程使用模式,它管理着...它的主要目的是减少程序员编写的重复代码,提高程序的效率和性能,在高并发的项目中会用到,比如node.js有很多异步操作,底层就是用线程池来处理的。
线程池中的空闲线程会从队列中取出任务并执行。 5. **任务队列**:可以使用链表或数组等数据结构来实现任务队列,用于存储待处理的任务。 6. **线程终止**:使用`pthread_join()`函数等待线程结束,或者设置为 ...
队列是另一种重要的数据结构,Java中的`Queue`接口提供了FIFO(先进先出)的数据结构,常用于线程间的通信或作为线程池的工作队列。`ArrayBlockingQueue`、`LinkedBlockingQueue`等是常见的阻塞队列实现,它们在多...
3. **线程调度**:线程池中的工作线程会定期检查任务队列,一旦发现有任务,就会从队列中取出任务并执行。这样,任务的分配和执行是异步进行的,提高了系统的并发性。 4. **线程管理**:当线程池中的线程完成任务后...
"工作中用到的各种Java功能代码大全"很可能包含了各种实用的Java代码片段,这些代码可能涵盖了日常开发中的各种常见任务和问题解决方案。让我们深入探讨一下这个主题,可能会包括以下几个方面: 1. **基础语法**:...
在Linux 系统下面用C 语言实现的高并发服务器的代码,具体用到了Epoll,线程池,数据库连接池。 具体可以看下连接http://blog.csdn.net/wuyuxing24/article/details/48758927
6. `IThreadExcute.cpp`:可能是一个接口文件,定义了线程执行任务的规范,所有要在线程池中运行的任务都需要实现这个接口。 7. `StdAfx.cpp`:在Visual C++项目中,这个文件通常包含了预编译头文件,用于提高编译...
每当有新的客户端连接请求时,服务器并不直接为每个客户端创建新的线程,而是从线程池中获取一个已存在的线程来处理请求。这样可以限制同时处理的客户端数量,防止资源耗尽。 2. **客户端连接**:客户端通过Socket...
最近阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 其中ThreadFactoryBuilder...