`
生亦何欢
  • 浏览: 11390 次
社区版块
存档分类
最新评论

线程池简单实现

阅读更多
转载地址:http://www.ibm.com/developerworks/cn/java/l-threadPool/#icomments

1. 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
/**
 * <p>Title: </p>
 * <p>Description: use to test thread pool</p>
 * <p>Copyright: Copyright (c) 2002</p>
 * <p>Company: </p>
 *
 * @author xingyong
 * 
 * @version 1.0
 */

public interface Task
{
   /**
    * set status of task .
    * @param flag
    */
   public void  setEnd(boolean flag) ;
   /**
    * start task
    * @throws java.lang.Exception
    */
   public abstract void startTask() throws Exception;

   /**
    * end tast
    * @throws java.lang.Exception
    */
   public abstract void endTask() throws Exception;

   /**
    * get status of task
    * @return boolean
    */
   public boolean isEnd() ;

}


2. 工作线程(WorkThread): 线程池中线程
import java.io.PrintStream;
import java.util.Vector;
/**
 * <p>Title: </p>
 * <p>Description: use to test thread pool</p>
 * <p>Copyright: Copyright (c) 2002</p>
 * <p>Company: </p>
 *
 * @author xingyong
 * 
 * @version 1.0
 */

public class WorkThread extends Thread
{
   
   public int threadNum;
   private boolean flag;

   private Vector taskVector;
   private Task task;

   /**
    * @param vector
    * @param i
    */
   public WorkThread(java.util.Vector vector, int i)
   {
        flag = true;
        threadNum = i;
        taskVector = vector;
        //hide entry here
        super.start();
   }

   public void run()
   {
        while(flag && taskVector != null)
        {
            synchronized(taskVector)
            {
                while(taskVector.isEmpty() && flag)
                    try
                    {
                        taskVector.wait();
                    }
                    catch(Exception exception) { }
                try
                {
                    task = (Task)taskVector.remove(0);
                }
                catch(Exception ex)
                {
                    task = null;
                }
                if(task == null)
                    continue;
            }
            try
            {
                task.setEnd(false);
                task.startTask();
            }
            catch(Exception ex)
            {
                 ex.printStackTrace();
            }
            try
            {
                if(!task.isEnd())
                {
                    task.setEnd(true);
                    task.endTask();
                }
            }
            catch(Exception ex)
            {
                 ex.printStackTrace();
            }
          
        }//end of while
   }

   public void closeThread()
   {
        flag = false;
        try
        {
            if(task != null)
                task.endTask();
        }
        catch(Exception exception)
        {
            exception.printStackTrace();
        }
        synchronized(taskVector)
        {
            taskVector.notifyAll();
        }
   }
}


3. 线程池ThreadPool
/**
 * <p>Title: </p>
 * <p>Description: use to test thread pool</p>
 * <p>Copyright: Copyright (c) 2002</p>
 * <p>Company: </p>
 *
 * @author xingyong
 * * @version 1.0
 *note: this test program refers to  Tarak Modi's test structure
 */

public class TestThreadPool
{
  private ThreadPoolManager threadPoolManager = null;
  public  Object testlock = new Object();
  public  int count = 0 ;
  int jobsNumber = 200;
  int sizeOfThreadPool = 20;
  int debug = 2;
  public TestThreadPool(int threadPoolSize,int jobsNum)
  {
    //System.out.println("size:    "+sizeOfThreadPool+"    jobs:    "+jobsNumber);
    sizeOfThreadPool = threadPoolSize;
    jobsNumber = jobsNum;
    long timeNoPool = 0;
    long timePool = 0;
    count = 0;
    System.err.println("Begin of testing strategy -- no pool");
    long start = System.currentTimeMillis();
    try
    {
      for(int i=0; i<jobsNumber ; i++)
      {
      CalculationTaskTest calculationTask = new CalculationTaskTest();
      new Thread(calculationTask).start();
      }
    }
    catch (OutOfMemoryError er)
    {
      System.out.println("No pool :OutOfMemoryError");
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }

    sleepToWait(5);
    if(debug > 3)
      System.out.println("no pool time:" +
		      (System.currentTimeMillis() - start));
      timeNoPool = System.currentTimeMillis() - start;
    System.err.println("End of no pool test");
    count = 0;
    //start = System.currentTimeMillis();
    System.err.println("Begin of  creating pool");
    threadPoolManager = new ThreadPoolManager(sizeOfThreadPool);
    System.err.println("End of  creating pool");
    System.err.println("Begin of testing the strategy  -- pool");
    //without the time for creating pool
    start = System.currentTimeMillis();
    try
    {
      for(int i=0; i<jobsNumber ; i++)
      {
      CalculationTaskTest calculationTaskTest = new CalculationTaskTest();
      threadPoolManager.addTask(calculationTaskTest);
      }
    }
    catch (OutOfMemoryError er)
    {
      System.out.println("pool :OutOfMemoryError"+" "+sizeOfThreadPool+" "+jobsNumber);
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }

    sleepToWait(5);
    if(debug > 3)
      System.out.println("pool time:" +
		       (System.currentTimeMillis() - start));
    timePool = System.currentTimeMillis() - start;
    System.err.println("End of thread pool test");
    System.out.println("without pool: "+timeNoPool+
    "    with pool: "+timePool);


    System.exit(0);

  }
  public  void sleepToWait(long l)
  {
   while(true)
   {
     synchronized(testlock)
       {
          if( count == jobsNumber )
             return;
        }
     try
      {
        //you can change it to wait end of all tasks
        Thread.sleep(l);
      }
      catch (Exception ex)
      { }
    }
  }

  public static void main(String[] args)
  { int poolSize = 20;
    int jobs= 200;

    if( args.length < 2 )
    {
			  System.err.println("Usage: java TestThreadPool " +
			    "<Size of ThreadPool> <jobs> ");
			  System.exit(-1);
    }
    try
    {
      poolSize = Integer.parseInt(args[0]);
      jobs = Integer.parseInt(args[1]);
    }
    catch (Exception ex)
    {
      System.out.println("Please input integer.");
      System.exit(-1);
    }
    new TestThreadPool(poolSize,jobs);
  }
  private  class CalculationTaskTest
                 implements Task,Runnable
{
  private boolean isEnd = true;
  public CalculationTaskTest()
  {
   isEnd = true;
  }

  public void setEnd(boolean flag)
  {
    /**@todo: Implement this Task method*/
    //throw new java.lang.UnsupportedOperationException("Method setEnd() not yet implemented.");
    isEnd = flag;
  }
  public void run()
  {
    int i = 1;
    int r = 1;



    //System.err.println("r:"+r);
     try
      {
        //you can change this line  to simulate something
        for(int ii=0;ii<100;ii++)
           r = r+i*i;
      }
      catch (Exception ex)
      { }
    synchronized(testlock)
    {
				 count++;

     }

  }
  public void startTask() throws Exception
  {
    /**@todo: Implement this Task method*/
    //throw new java.lang.UnsupportedOperationException("Method startTask() not yet implemented.");
    //System.err.print("use pool");
    run();
  }
  public void endTask() throws Exception
  {
    /**@todo: Implement this Task method*/
    //throw new java.lang.UnsupportedOperationException("Method endTask() not yet implemented.");
    //free resource here
  }
  public boolean isEnd()
  {
    /**@todo: Implement this Task method*/
    //throw new java.lang.UnsupportedOperationException("Method isEnd() not yet implemented.");
    return isEnd;
  }
}
}


4. 线程池管理器(ThreadPoolManager):用于创建并管理线程池
import java.util.Vector;
/**
 * <p>Title: </p>
 * <p>Description: use to test simple thread pool</p>
 * <p>Copyright: Copyright (c) 2002</p>
 * <p>Company: </p>
 *
 * @author xingyong
 *
 * @version 1.0
 */
public class ThreadPoolManager
{

   /**
    * the number of threads in pool
    */
   private int threadNum;
   /**
    * the default number of threads in pool
    */
   private int defaultThreadNum;
   /**
    * the vector of threads in pool
    */
   private Vector workThreadVector;
   /**
    * the vector of tasks
    */
   private Vector taskVector;

   /**
    * @param i
    */
   public ThreadPoolManager(int i)
   {
        taskVector = new Vector(10, 10);
        //initial thread number
        defaultThreadNum = 10;
        if(i > 0)
            defaultThreadNum = i;
        //call thread
        CreateThreadPool(i);
   }

   public ThreadPoolManager()
   {
        this(10);
   }
   /**
    *
    * @return
    */
   public boolean isAllTaskFinish()
   {
     return taskVector.isEmpty();
   }
   /**
    * @return int
    */
   public int getThreadNum()
   {
        return threadNum;
   }



   /**
    * create thread pool
    * @param i
    */
   private void CreateThreadPool(int i)
   {
        if(workThreadVector == null)
            workThreadVector = new Vector(i);
        Object obj = null;
        //create threads
        synchronized(workThreadVector)
        {
            for(int j = 0; j < i; j++)
            {
                threadNum++;
                WorkThread workThread = new WorkThread(taskVector, threadNum);
                workThreadVector.addElement(workThread);
            }

        }
   }

   /**
    * add task to task vector and notify work Threads in pool
    * to do it
    * @param taskObj
    */
   public void addTask(Task taskObj)
   {
        if(taskObj == null)
            return;
        synchronized(taskVector)
        {
            taskVector.addElement(taskObj);
            taskVector.notifyAll();
        }
   }

  /**
   * destroy  threads in pool
   */
   public void closeThread()
   {
        Object obj = null;

        while(!workThreadVector.isEmpty())
        {


            try
            {
                WorkThread workThread = (WorkThread)workThreadVector.remove(0);
                workThread.closeThread();
                continue;
            }
            catch(Exception exception)
            {

                    exception.printStackTrace();
            }
            break;
        }
   }
}

分享到:
评论

相关推荐

    易语言真正的线程池简易实现

    易语言简易线程池的实现。 ——V雪落有声V原创。转载请保留。前文:。为了能充分理解本篇文章的内容,需要了解的知识如下:。1.事件对象的使用:http://baike.baidu.com/view/751499.htm。2.信号量的使用:...

    一个简单线程池的实现

    在这个简单的线程池实现中,我们可以通过`pthread_pool.cpp`、`MainFunctionForTest.cpp`、`twork_work.cpp`、`pthread_pool.h`和`twork_work.h`这五个文件来理解其基本架构和工作原理。 首先,`pthread_pool.h`...

    线程池简单实现chenjiegui

    在Java中,线程池是通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类来实现的,如`ThreadPoolExecutor`。下面我们将深入探讨线程池的工作原理、核心参数以及如何在实际开发中使用线程池。 线程池...

    c++11线程池简单实现

    本资源是基于C++11标准实现的一个简单的线程池,它利用了C++11的新特性,如`std::thread`,`std::function`,以及智能指针等。 首先,`std::thread`是C++11引入的用于创建和管理线程的类。通过创建`std::thread`...

    C++11 简易线程池实现

    简易的C++11线程池实现,线程池为固定方式,后面会新增非固定模式。

    简单C++线程池实现

    本文将深入探讨如何实现一个简单的线程池,并通过提供的文件名`_threadpool.cpp`, `_promain.cpp`, `_threadpool.h`来解释其核心概念和组件。 首先,`_threadpool.h`是头文件,通常包含类定义和相关函数声明。...

    线程池的简单实现

    下面将详细讨论线程池的原理及其在Java中的实现。 首先,我们来看`ThreadPoolManager`类,这个类通常用于管理线程池,包括初始化线程池、提交任务以及关闭线程池等操作。线程池的大小可以通过参数设置,可以根据...

    线程池的实现以及底层原理.docx

    "线程池的实现以及底层原理" 线程池是Java多线程编程中的一种常见技术,能够提高系统的性能和可靠性。本文将详细介绍线程池的实现原理、线程池的优势、线程池的类型、线程池的创建方式以及线程池的使用注意事项。 ...

    Linux C线程池简单实现实例

    ### Linux C线程池简单实现实例 #### 概述 在多线程编程中,线程池是一种广泛采用的设计模式。它通过预先创建多个线程,并将它们组织成一个池,来处理提交的任务,从而避免了频繁创建与销毁线程所带来的性能开销。...

    简单线程池与线程池检查的实现

    标题 "简单线程池与线程池检查的实现" 涉及到的是计算机编程中的多线程管理和优化,特别是线程池的概念及其检查机制。线程池是一种多线程处理形式,预先创建一定数量的线程,放入池中,当有任务需要执行时,直接从池...

    VC++ 线程池(ThreadPool)实现

    本文将深入探讨VC++中线程池的实现,并提供一个简单的实现示例。 线程池的基本概念: 线程池是由一组工作线程组成的集合,这些线程预先创建并处于待命状态,等待执行由应用程序提交的任务。当一个任务被提交到...

    c++简单线程池的实现

    本文将深入探讨如何在Visual Studio 2015(VS2015)环境下实现一个简单的线程池,并解析提供的`TestThreadPool.sln`解决方案和`TestThreadPool`源代码文件。 线程池的基本思想是维护一组预先创建的线程,这些线程...

    C++实现线程池详解(基于boost源码以及封装等线程池)

    三、简单的C++线程池代码示例 四、 基于boost编写的源码库 - 线程池 4.1 基于boost编写的源码库地址 4.2 boost线程池的先进先出、后进先出、优先级代码示例 五、看看人家线程池怎么写的 - 要理解精髓 六、线程池应用...

    线程池的实现java

    线程池的实现,简单的实现了线程池的功能,稍微改动就可以应用到项目中了

    易语言-易语言真正的线程池简易实现

    易语言简易线程池的实现 ——V雪落有声V原创 转载请保留 前文: 为了能充分理解本篇文章的内容,需要了解的知识如下: 1.事件对象的使用:http://baike.baidu.com/view/751499.htm 2.信号量的使用:...

    简单的线程池的.net实现

    本项目"简单的线程池的.net实现"提供了一个自定义线程池的示例,帮助开发者更好地理解和运用线程池。 首先,线程池的主要优点在于其资源管理效率。当任务到达时,线程池会检查是否有空闲线程可供使用,如果有的话,...

    使用Vector实现简单线程池

    然而,如果我们想要从头开始理解线程池的工作原理,或者在特定场景下自定义线程池的行为,那么使用`Vector`来实现简单的线程池是一个很好的学习实践。 标题"使用Vector实现简单线程池"指的是将Java中的`Vector`类...

    线程池实现,通过C语言实现

    在给定的资源中,"200行C代码实现简单线程池.doc"可能包含了详细的设计和实现步骤,以及如何在实际项目中应用线程池的文档。而"threadpool.c"则是实际的C语言源代码文件,实现了线程池的核心功能。下面我们将探讨...

Global site tag (gtag.js) - Google Analytics