`
wenqxin
  • 浏览: 14255 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

工作中用到的线程池

阅读更多
工作中用到的线程池代码,单例模式写的,感觉不错.记下来.

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线程池

    java开发过程,经常会用到线程池技术,这里简单介绍一个构建线程池的实例

    java线程池概念.txt

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

    delphi线程池mcpage实例

    - 注意异常处理,确保线程池中的线程在出现异常时能正确关闭。 通过理解这些核心概念,你可以根据具体需求构建自己的线程池系统,利用MCPageCheck这样的组件来提升并发处理能力。在实际项目中,正确使用线程池可以...

    Java实现的线程池、消息队列功能

    线程池是一种线程使用模式,它预先创建了一组可重用的线程,当有任务需要执行时,不再直接创建新的线程,而是从线程池中取出一个空闲线程来执行任务,完成任务后线程返回到线程池而不是直接销毁。这样可以避免频繁地...

    非常好用的C语言线程池,自己测试通过

    3. **任务调度**:线程池中的空闲线程会从任务队列中取出任务进行执行。 4. **线程复用**:执行完任务的线程不会立即销毁,而是回到等待队列中,准备执行下一个任务。 5. **动态调整**:根据系统负载和资源状况,...

    Java 线程池.pptx

    讲述了java线程池的优点,参数,6种线程池的使用场景,线程池用到的handler,线程任务的提交方式等等。

    Boost线程池的例子,用opencv在线程中处理图片

    为了在Boost线程池中使用OpenCV处理图像,你需要按照以下步骤操作: 1. **初始化线程池**:首先,创建一个Boost线程池实例,指定线程数量。这通常根据系统资源和任务需求来决定。 2. **定义任务**:编写一个函数或...

    C线程池简单应用层实现

    在描述中提到的双向循环链表是一种数据结构,用于存储线程池中的待处理任务。相比于数组,链表允许动态扩展,更灵活地插入和删除元素。在C语言中,双向循环链表通常包含节点结构体,每个节点包含数据域(例如任务...

    自己写的C#线程池

    从易语言转型到C#感觉C#自带的线程池不够灵活(或许是自己的技术不够),所以自己写了一个线程池工作类为了配合自己的使用习惯,有兴趣的可以下载参考 代码用到的是信号处理以及队列等一些比较基础的东西,已经测试了功能...

    QTcpServiceTest.zip_QT TCP_VS2010 Qt 线程_qt 界面_线程池_线程池 TCP

    qt编写tcp服务器程序,用到线程池。在vs2010/qtcreator4.8下运行正常.

    Qt QThreadPool线程池 Demo

    线程池是什么 QThreadPool 线程池是一种线程使用模式,它管理着...它的主要目的是减少程序员编写的重复代码,提高程序的效率和性能,在高并发的项目中会用到,比如node.js有很多异步操作,底层就是用线程池来处理的。

    C语言实现的线程池.zip

    线程池中的空闲线程会从队列中取出任务并执行。 5. **任务队列**:可以使用链表或数组等数据结构来实现任务队列,用于存储待处理的任务。 6. **线程终止**:使用`pthread_join()`函数等待线程结束,或者设置为 ...

    线程-线程池-锁-集合-Map-队列.docx

    队列是另一种重要的数据结构,Java中的`Queue`接口提供了FIFO(先进先出)的数据结构,常用于线程间的通信或作为线程池的工作队列。`ArrayBlockingQueue`、`LinkedBlockingQueue`等是常见的阻塞队列实现,它们在多...

    线程池设计

    3. **线程调度**:线程池中的工作线程会定期检查任务队列,一旦发现有任务,就会从队列中取出任务并执行。这样,任务的分配和执行是异步进行的,提高了系统的并发性。 4. **线程管理**:当线程池中的线程完成任务后...

    工作中用到的各种java功能代码大全

    "工作中用到的各种Java功能代码大全"很可能包含了各种实用的Java代码片段,这些代码可能涵盖了日常开发中的各种常见任务和问题解决方案。让我们深入探讨一下这个主题,可能会包括以下几个方面: 1. **基础语法**:...

    Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)

    在Linux 系统下面用C 语言实现的高并发服务器的代码,具体用到了Epoll,线程池,数据库连接池。 具体可以看下连接http://blog.csdn.net/wuyuxing24/article/details/48758927

    端口转发程序,简单线程池实现,在此基础上可以改进

    6. `IThreadExcute.cpp`:可能是一个接口文件,定义了线程执行任务的规范,所有要在线程池中运行的任务都需要实现这个接口。 7. `StdAfx.cpp`:在Visual C++项目中,这个文件通常包含了预编译头文件,用于提高编译...

    简单实用,线程池+socket收发数据+解析字节格式报文

    每当有新的客户端连接请求时,服务器并不直接为每个客户端创建新的线程,而是从线程池中获取一个已存在的线程来处理请求。这样可以限制同时处理的客户端数量,防止资源耗尽。 2. **客户端连接**:客户端通过Socket...

    google用于管理线程,符合阿里线程池规范ThreadFactoryBuilder的jar包 guava 27.0.1-jre.jar

    最近阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 其中ThreadFactoryBuilder...

Global site tag (gtag.js) - Google Analytics