`
ispring
  • 浏览: 360027 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

简单线程池的实现

    博客分类:
  • Java
阅读更多
最近看了下JAVA线程相关的资料,顺便写了个自己的线程池的实现方式,记录一下。


首先定义一个简单的任务:
/**
 * Task
 * Created on: 2008-9-29 上午10:29:18
 * Description: 
 */
package cn.edu.ccnu.inc.ivan.thread;

/**
 * @author <a href="mailto:huangfengjing@gmail.com">Ivan</a>
 */
public interface Task {

	public int getNum();
	public void execute();
}


其次定义工作线程,该线程用于执行任务:
/**
 * WorkThread
 * Created on: 2008-9-29 上午10:30:06
 * Description: 
 */
package cn.edu.ccnu.inc.ivan.thread;

import java.util.Queue;

/**
 * @author <a href="mailto:huangfengjing@gmail.com">Ivan</a>
 */
public class WorkThread extends Thread {
	
	/**
	 * 线程关闭的标识位
	 */
	private boolean shutDown = false;
	
	/**
	 * 线程池管理器
	 */
	ThreadPoolManager mgr;
	
	/**
	 * 任务队列
	 */
	private Queue<Task> taskQueue;
	
	public WorkThread(ThreadPoolManager mgr, Queue<Task> taskQueue, String name) {
		super(name);
		this.mgr = mgr;
		this.taskQueue = taskQueue;
	}
	
	public void run() {
		while(!shutDown) {
			Task task;
			// 如果任务队列不为空,则取出一个任务并开始执行,否则线程等等
			if(!taskQueue.isEmpty()) {
				synchronized(taskQueue) {
					task = taskQueue.poll();
				}
				task.execute();
				// 任务执行完毕之后释放线程到空闲线程队列中
				mgr.releaseThread(this);
			} else {
				try {
					synchronized(taskQueue) {
						taskQueue.wait();
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	public void shutDown() {
		this.shutDown = true;
	}
}


最后就是其核心类,线程池管理器:
/**
 * ThreadPoolManager
 * Created on: 2008-9-29 上午10:34:09
 * Description: 
 */
package cn.edu.ccnu.inc.ivan.thread;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * @author <a href="mailto:huangfengjing@gmail.com">Ivan</a>
 */
public class ThreadPoolManager {

	public static int DEFAULT_POOL_SIZE = 5;
	public static int POOL_SIZE = 0;
	
	/**
	 * 空闲线程
	 */
	private Queue<WorkThread> idleThread;
	
	/**
	 * 任务队列
	 */
	private Queue<Task> taskQueue;
	
	/**
	 * 线程池大小
	 */
	private int poolSize;
	
	public ThreadPoolManager() {
		this(DEFAULT_POOL_SIZE);
	}
	
	public ThreadPoolManager(int poolSize) {
		if(poolSize < 0) {
			this.poolSize = DEFAULT_POOL_SIZE;
		} else {
			this.poolSize = poolSize;
		}
		idleThread = new ConcurrentLinkedQueue<WorkThread>();
		taskQueue = new ConcurrentLinkedQueue<Task>();
		init();
	}
	
	/**
	 * 初始化线程池,新建 N 个空闲线程
	 *
	 */
	private void init() {
		System.out.println("Start up thread pool...");
		synchronized(taskQueue) {
			for(int i=0; i < poolSize; i++) {
				WorkThread workThread = new WorkThread(this, taskQueue, "Thread " + i);
				idleThread.add(workThread);
				POOL_SIZE++;
				workThread.start();
			}
		}
	}
	
	/**
	 * 关闭线程池,关闭线程池中各个线程
	 * 在调用该方法后,线程并没有马上关闭,而是在线程任务执行完之后关闭
	 *
	 */
	public void shutDown() {
		System.out.println("Shut down all work thread...");
		synchronized(taskQueue) {
			for(WorkThread thread : idleThread) {
				thread.shutDown();
			}
		}
	}
	
	/**
	 * 添加任务并唤醒各因无任务而等待的空闲线程
	 * @param task
	 * @throws Exception
	 */
	public void addTask(Task task) throws Exception {
		synchronized(taskQueue) {
			taskQueue.add(task);
			taskQueue.notifyAll();
		}
	}
	
//	public void schedule() throws Exception {
//		while(!shutDown) {
//			if(!taskQueue.isEmpty()) {
//				WorkThread workThread = getIdleThread();
//				synchronized(workThread) {
//					workThread.notifyAll();
//				}
//			} else {
//				taskQueue.wait();
//			}
//		}
//	}
	
	/**
	 * 获取空闲线程,当线程池内无空闲线程时等待
	 * @return
	 * @throws Exception
	 */
	public WorkThread getIdleThread() throws Exception {
		if(idleThread.isEmpty()) {
			System.out.println("No idle thread in pool, please wait...");
			idleThread.wait();
		}
		synchronized(idleThread) {
			return idleThread.poll();
		}
	}
	
	/**
	 * 释放线程
	 * @param thread
	 */
	public void releaseThread(WorkThread thread) {
		System.out.println("Release the thread [" + thread.getName() + "] to the pool...");
		synchronized(idleThread) {
			idleThread.add(thread);
			idleThread.notifyAll();
		}
	}
}

测试起来就比较简单,为了模拟线程效果,在任务中只是打印一行执行过程,并让线程睡眠一段时间,同样,在所有任务执行完成后,让线程池睡眠一段时间再关闭:
/**
 * SimpleTask
 * Created on: 2008-9-29 上午10:47:07
 * Description: 
 */
package cn.edu.ccnu.inc.ivan.thread;

import edu.ccnu.inc.ivan.util.DateUtils;

/**
 * @author <a href="mailto:huangfengjing@gmail.com">Ivan</a>
 */
public class SimpleTask implements Task {

	int num = 0;
	
	public SimpleTask(int num) {
		this.num = num;
	}

	public void execute() {
		try {
			System.out.println("[" + DateUtils.getTimeNow() + "] Task[" + getNum() + "]:I have worked in thread [" + Thread.currentThread().getName() + "]");
			Thread.sleep(Math.round(Math.random() * 1000));
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
}


/**
 * TestThreadPoolManager
 * Created on: 2008-9-29 上午10:45:35
 * Description: 
 */
package cn.edu.ccnu.inc.ivan.thread;

import junit.framework.TestCase;

/**
 * @author <a href="mailto:huangfengjing@gmail.com">Ivan</a>
 */
public class TestThreadPoolManager extends TestCase {

	public void testManager() throws Exception {
		ThreadPoolManager pool = new ThreadPoolManager();
		for(int i = 0; i < 100; i++) {
			pool.addTask(new SimpleTask(i));
		}
		Thread.sleep(1000 * 10);
		pool.shutDown();
	}

}
分享到:
评论
3 楼 treblesoftware 2009-09-23  
LZ,代码写的是不错,不过这个设计实在是没弹性啊。
2 楼 kqy929 2009-09-23  
ivyloo 写道
为什么不用jdk自带的线程池呢?!

就是,就是。
java.util.concurrent 现成的这么好的资源却不用。
1 楼 ivyloo 2009-09-22  
为什么不用jdk自带的线程池呢?!

相关推荐

    C++11 简易线程池实现

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

    19 自己动手丰衣足食—简单线程池实现.pdf

    【标题】:19 自己动手丰衣足食—简单线程池实现 【描述】:本章节将探讨Java并发编程中的线程池实现,通过自己动手创建一个简单的线程池,来理解线程池的工作原理及其优势。 【知识点详解】: 1. **线程池的必要...

    一个简单线程池的实现

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

    简单C++线程池实现

    总结来说,这个简单的C++线程池实现是一个学习多线程和并发编程的好起点。它通过封装线程管理和任务调度,为开发者提供了一种更高效、更可控的方式来处理并发任务。在实际应用中,线程池可以被扩展以适应更复杂的...

    简单线程池实现,凑字数

    一个简单的线程池实现通常包括以下几个关键部分: 1. **线程池初始化**:创建线程池时,需要设定一些参数,如核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、线程存活时间(keepAliveTime)以及单位...

    这是一个使用C++实现的简易线程池.zip

    这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易线程池.zip这是一个使用C++实现的简易...

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

    在给定的标题和描述中,提到的是一个端口转发程序的实现,使用了简单的线程池技术。 线程池是一种编程概念,它管理一组预先创建的线程,以便高效地处理多个并发任务。在操作系统中,创建和销毁线程都有一定的开销,...

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

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

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

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

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

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

    C语言实现简单线程池.zip

    总的来说,这个项目提供了一个基础的C语言线程池实现,展示了如何利用POSIX线程在Linux环境下进行多线程编程。理解和实现这样的线程池不仅可以提高程序的效率,还能帮助开发者深入理解操作系统级的并发编程。

    C语言实现的简单线程池

    C语言实现的简单线程池

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

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

    使用Vector实现简单线程池

    不过,实际生产环境中的线程池实现往往会选择更高效的数据结构,例如`BlockingQueue`,并配合`ExecutorService`的高级特性,如定时任务、工作队列大小控制等。 在实际项目中,使用标准库提供的`ExecutorService`和`...

    线程池 这是一个简单的 C++11 线程池实现

    线程池 这是一个简单的 C++11 线程池实现。

    线程池的简单实现

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

    Linux下C线程池实现

    在Linux下用C写的一个简易线程池。系统是RedHat 9,gcc版本"gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)"。文件夹里的源码是按工程组织好的,在文件夹下的test目录下面有一个小的测试程序和Makefile,编译后即可...

    c++简单线程池的实现

    通过这个简单的线程池实现,我们可以更好地理解和控制并发任务的调度,同时避免了频繁创建和销毁线程的开销。在实际项目中,线程池可以进一步优化,例如添加任务优先级支持、限制并发执行的任务数量、设置超时机制等...

    简单的线程池的.net实现

    "DotNetInfra.ThreadingServices.Common"可能包含了线程池实现过程中的一些通用工具或类,例如线程安全的数据结构、信号量、锁等,这些都是构建高效线程池必不可少的组件。 "readme.txt"文件通常会提供项目简介、...

    VC++ 线程池(ThreadPool)实现

    以下是一个简化的VC++线程池实现示例: ```cpp #include // 工作函数原型 typedef VOID ( WINAPI *PTP_CALLBACK_ENVIRON )(PTP_CALLBACK_INSTANCE, PVOID, PTP_WORK); // 工作函数 VOID WINAPI WorkerFunction...

Global site tag (gtag.js) - Google Analytics