最近看hadoop的时候,无意中看到了concurrent包中的类,于是打算好好研究一下线程安全方面的东西。先自己实现一个线程池。然后和sun自带的threadpool比较一下,看自己的实现有什么问题。
1. ThreadPool 类,用于存储工作线程,在构造函数中创建线程,并启动线程
package com.fnk.threadpool; import java.util.Vector; public class ThreadPool { private Vector<Thread> threads; private static final int DEFAULT_THREAD_SIZE = 5; ThreadPool(ThreadWorkQueue workQueue) throws InvalidThreadParamException{ this(workQueue,DEFAULT_THREAD_SIZE); } ThreadPool(ThreadWorkQueue workQueue,int threadSize) throws InvalidThreadParamException{ if(workQueue == null || threadSize <= 0){ throw new InvalidThreadParamException(); } this.threads = new Vector<Thread>(); for(int i = 0 ; i < threadSize; i++){ threads.add(new WorkThread(workQueue)); threads.get(i).start(); } } }
2.任务队列类
package com.fnk.threadpool; import java.util.Vector; /* * 任务队列类,用于存储任务。先到的任务,先执行 */ public class ThreadWorkQueue { private Vector<WorkIntf> works; public Object mutex = new Object(); ThreadWorkQueue(){ works = new Vector<WorkIntf>(); } /* * 任务进队列,如果原来的队列中的任务数为0,唤醒任务线程 */ public void enQueue(WorkIntf work){ if(works.size() == 0){ works.add(work); synchronized (mutex) { mutex.notifyAll(); } }else{ works.add(work); } } /* * 任务出队列,如果队列中的任务数为0,让线程等待 */ public WorkIntf deQueue(){ if(works.size() == 0){ synchronized (mutex) { try { mutex.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; }else{ return works.remove(0); } } }
3.任务接口类
package com.fnk.threadpool; public interface WorkIntf { public boolean doWork(); }
4. 工作线程类
package com.fnk.threadpool; //任务线程类 public class WorkThread extends Thread { ThreadWorkQueue workQueue; WorkThread(ThreadWorkQueue workQueue) { this.workQueue = workQueue; } public void run() { while (true) { WorkIntf work = null; //获取任务,如果任务队列中, work = workQueue.deQueue(); //如果 有任务 ,那么就工作 if (work != null) { work.doWork(); } } } }
5. 异常类
package com.fnk.threadpool; public class InvalidThreadParamException extends Exception { /** * */ private static final long serialVersionUID = 1L; public InvalidThreadParamException() { super(); } public InvalidThreadParamException(String message) { super(message); } public InvalidThreadParamException(String message, Throwable cause) { super(message, cause); } public InvalidThreadParamException(Throwable cause) { super(cause); } }
6. 测试
package com.fnk.threadpool; public class TestThreadPool { public static void main(String[] args) { try { ThreadWorkQueue workQueue = new ThreadWorkQueue(); ThreadPool tp = new ThreadPool(workQueue); for(int i = 0; i < 10 ; i++){ workQueue.enQueue(new WorkImpl(i)); } } catch (InvalidThreadParamException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
总结:缺点是不能动态的控制线程的个数,在线程池开启的时候就必须创建所以线程。
下面这段代码可能会导致dequeue线程永远被阻塞,这种情况出现在dequeue变成wait状态,而works队列一直有数据,建议换成blockqueue,参照JDK的ThreadPool
/* * 任务进队列,如果原来的队列中的任务数为0,唤醒任务线程 */ public void enQueue(WorkIntf work){ if(works.size() == 0){ works.add(work); synchronized (mutex) { mutex.notifyAll(); } }else{ works.add(work); } } /* * 任务出队列,如果队列中的任务数为0,让线程等待 */ public WorkIntf deQueue(){ if(works.size() == 0){ synchronized (mutex) { try { mutex.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; }else{ return works.remove(0); } }
相关推荐
【作品名称】:基于C++使用 epoll + threadpool 实现的 webServer,支持GET、POST 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 ...
基于C++使用 epoll + threadpool 实现的 webServer,支持GET、POST C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更...
threadpool实现方式 threadpool实现方式 threadpool实现方式
由于最近需要用多线程处理一些问题,一开始我用了.net默认的...于是我自己实现了一个简单的ThreadPool。 写的比较简单,有兴趣的朋友一起看看,共同改进。 代码主要由ThreadPoolEx,WorkItem,WorkQueue组成。
threadPool的实现代码
用于服务器上的计算工作的自定义ThreadPool实现(示例计算是第N个斐波纳契数)。 请参阅页面底部的基准测试结果。 设计注意事项: 服务器应用程序可以选择池设置,例如最小和最大线程,线程空闲时间等。 随着工作...
主要为大家详细介绍了python线程池threadpool的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这是C ++中的简单ThreadPool实现。 此实现提供以下功能: 每个池实例的可配置线程数。 动态线程数修改SetThreadCount(size_t) 两种ThreadPool停止模式:同步和异步 main.cpp提供了使用此ThreadPool的示例代码。 ...
C++ 实现线程池ThreadPool
C++ 线程池 资源的有效调度 通过线程池可以实现资源的有限利用,同时防止读写锁。
boost库就不介绍了,网上很容易查到,这个threadpool 是基于boost库的半官方实现,使用方法请参照博客http://blog.csdn.net/yuguanquan1990/article/details/39899853
C++11 线程池 ThreadPool 单例 线程池,实现全局唯一。
概述ThreadPool实现了一个有界线程池,该线程池具有最小的核心池大小,并且可以为空闲线程配置可保持活动状态; 那些熟悉Java 会发现熟悉的接口和语义。 其核心是预先分配的工作线程池。 如果有空闲工人可用,或者...
VC++实现的线程池代码,仅供参考,如果实际项目要用必须经过大量测试。
c++实现的多线程池源代码threadpool