**
线程池是一组线程,限制执行任务的线程数
*/
public class ThreadPool extends ThreadGroup {
private boolean isAlive;
private LinkedList taskQueue;
private int threadID;
private static int threadPoolID;
/**
创建新的线程池,numThreads是池中的线程数
*/
public ThreadPool(int numThreads) {
super("ThreadPool-" + (threadPoolID++));
setDaemon(true);
isAlive = true;
taskQueue = new LinkedList();
for (int i=0; i<numThreads; i++) {
new PooledThread().start();
}
}
/**
请求新任务。人物在池中下一空闲线程中运行,任务按收到的顺序执行
*/
public synchronized void runTask(Runnable task) {
if (!isAlive) {
throw new IllegalStateException();//线程被关则抛出IllegalStateException异常
}
if (task != null) {
taskQueue.add(task);
notify();
}
}
protected synchronized Runnable getTask()
throws InterruptedException
{
while (taskQueue.size() == 0) {
if (!isAlive) {
return null;
}
wait();
}
return (Runnable)taskQueue.removeFirst();
}
/**
关闭线程池,所有线程停止,不再执行任务
*/
public synchronized void close() {
if (isAlive) {
isAlive = false;
taskQueue.clear();
interrupt();
}
}
/**
关闭线程池并等待所有线程完成,执行等待的任务
*/
public void join() {
//告诉等待线程线程池已关
synchronized (this) {
isAlive = false;
notifyAll();
}
// 等待所有线程完成
Thread[] threads = new Thread[activeCount()];
int count = enumerate(threads);
for (int i=0; i<count; i++) {
try {
threads[i].join();
}
catch (InterruptedException ex) { }
}
}
/**
用于进行任务的线程
*/
private class PooledThread extends Thread {
public PooledThread() {
super(ThreadPool.this,
"PooledThread-" + (threadID++));
}
public void run() {
while (!isInterrupted()) {
// 得到任务
Runnable task = null;
try {
task = getTask();
}
catch (InterruptedException ex) { }
// 若getTask()返回null或中断,则关闭此线程并返回
if (task == null) {
return;
}
// 运行任务,吸收异常
try {
task.run();
}
catch (Throwable t) {
uncaughtException(this, t);
}
}
}
}
}
*********************************************
要测试这个线程池,可以通过下面这个Test程序!
*********************************************
(ThreadPoolTest.java)
public class ThreadPoolTest {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("Tests the ThreadPool task.");
System.out.println(
"Usage: java ThreadPoolTest numTasks numThreads");
System.out.println(
" numTasks - integer: number of task to run.");
System.out.println(
" numThreads - integer: number of threads " +
"in the thread pool.");
return;
}
int numTasks = Integer.parseInt(args[0]);
int numThreads = Integer.parseInt(args[1]);
// 生成线程池
ThreadPool threadPool = new ThreadPool(numThreads);
// 运行任务
for (int i=0; i<numTasks; i++) {
threadPool.runTask(createTask(i));
}
// 关闭线程池并等待所有任务完成
threadPool.join();
}
/**
一个简单的任务(打印ID)
*/
private static Runnable createTask(final int taskID) {
return new Runnable() {
public void run() {
System.out.println("Task " + taskID + ": start");
// 增加耗时
try {
Thread.sleep(500);
}
catch (InterruptedException ex) { }
System.out.println("Task " + taskID + ": end");
}
};
}
}
分享到:
相关推荐
C++线程池实现 vc2015编译
VC实现的线程池例程,深入地讲解操作系统实现的线程池的优越性,尝试实现一个简单的线程池模型。
自已用Qt写的线程池实现程序,可以正常运行,用socket进行通讯,很适合初学者学习借鉴;
vc实现多线程池的例子threadpooldemosrc.rar
企业级跨平台C++线程池实现,带vs工程例子,易于使用,功能完善,经过企业级的线上测试的C++线程池实现。
java 线程池 实现 例子,线程池实例
Quartz 线程池 中剥离出来的代码 不例子
c++线程池类以及线程类代码实现,对于初学者来说是个很好的例子。
线程池实现的例子,不错,有用的可以参看
VC写的一个线程池的管理实例,实现多线程管理的好代码值得学习
As you see ,在C++类中创建线程池是有限制的,为了使已经写好的代码维持最小改动,我将网上广为流传的线程池代码(至今没有找到一个可以顺利运行并直接使用的例子)进行了加工,使其满足我们项目的要求。...
因为项目需要,还涉及到排队下载的功能,所以就选择了线程池来管理线程以及线程池里面的任务队列workQueue来实现项目所需的功能; b:在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大...
在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2....下面是一个线程池例子,经测试绝对可行:
c++实现的线程池,含有类图、流程图、简单的使用例子、makefile。
C++封装的linux下的可动态增减的线程池,总共有三个源文件: main.cpp 为例子程序,ThreadPool.cpp和ThreadPool.h为线程池实现文件,仅供学习交流使用
用C#自己实现的线程池。很好的范例。有助于对线程池,线程同步,线程锁的学习。很真研究通这个例子之后,我相信你对线程肯定有深刻的了解
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台 线程。每个线程都使用默认的堆栈 大小,以默认的优先级运行,并处于多线程单元中。超过最大值的...
在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下,ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不同,这些数据可能会有变化) 下载文件服务器的...
线程池示例(包含自定义拒绝策略),演示了如何创建一个线程池,以及添加到队列的过程,先添加到工作线程,然后是缓存队列,最后是创建临时线程
主要介绍了php与python实现的线程池多线程爬虫功能,结合实例形式分析了php与python实现线程池多线程爬虫的完整实现方法,需要的朋友可以参考下