线程池使用背景:当有大批量的任务在一个时间段需要执行的时候,为了控制开辟的线程数量,节约资源,就应该考虑到线程池的使用。
由此想到的一个关于程序级别的性能调优问题,说到多线程这里,当有复杂而且耗时的任务需要处理的时候,首先应考虑到使用多线程进行并发处理,但当需要处理的任务数量特别多的情况下,又应该开始考虑到线程池的使用以控制开启的线程数量。
下面是一个线程池的具体实现:
import java.util.LinkedList;
import org.apache.log4j.Logger;
public class ThreadPoolMage {
/**
* 线程池中线程个数
*/
private final int nThreads;
/**
* 存放线程
*/
private final PoolWorker[] threads;
private static ThreadPoolMage PoolObj = null;
/**
* 事件队列
*/
private final LinkedList queue;
public static ThreadPoolMage getInstance(int nThreads) {
if (PoolObj==null){
PoolObj = new ThreadPoolMage(nThreads);
}
return PoolObj ;
}
private static final Logger logger = Logger
.getLogger(ThreadPoolMage.class);
/**
* 构造函数
*
* @param nThreads
* 线程个数
*/
private ThreadPoolMage(int nThreads) {
logger.info("ThreadPoolManager run");
this.nThreads = nThreads;
queue = new LinkedList();
if (System.getProperty("nthread")!=null){
try{
nThreads = Integer.parseInt(System.getProperty("nthread"));
}catch(Exception ex){
}
}
threads = new PoolWorker[nThreads];
logger.info("start the thread");
// 启动线程
for (int i = 0; i < nThreads; i++) {
logger.info("Start thread : " + i);
threads[i] = new PoolWorker(i);
threads[i].start();
}
}
/**
* 入队
*
* @param r
* 需要入队的事件,供外部调用,加入需要执行的任务
*/
public void execute(Runnable r) {
synchronized (queue) {
logger.info("add runnable into queue");
// 加入队列
queue.addLast(r);
// 通知正在阻塞的线程
queue.notify();
}
}
public void close() {
for (int i = 0; i < threads.length; i++) {
PoolWorker aWorker = threads[i];
aWorker.close();
}
synchronized (queue) {
queue.notifyAll();
}
}
/**
* <p>
* Title: PoolWorker
* </p>
* <p>
* Description: 线程池中的线程
* </p>
* <p>
*/
public class PoolWorker extends Thread {
private int threadNumber;
public PoolWorker(int threadNumber) {
this.threadNumber = threadNumber;
}
public int getThreadNumber() {
return threadNumber;
}
private boolean isFinished = false;
public void close() {
isFinished = true;
}
/**
* 线程运行函数
*/
public void run() {
// DebugPrint.printThreadDebug("PoolWork thread begin to run");
Runnable r;
while (!isFinished) {
synchronized (queue) {
// 如果队列为空,等
while (queue.isEmpty()) {
try {
/*
* DebugPrint .printThreadDebug("queue is empty,
* begin waiting");
*/
if(isFinished) {
return;
}
queue.wait();
} catch (InterruptedException ignored) {
// 捕到异常就忽略
/*
* DebugPrint .printThreadDebug("There is an
* exception, ignored it");
* DebugPrint.printException(ignored);
*/}
}
/*
* DebugPrint .printThreadDebug("Now queue isn't empty,
* begin running");
*/// 不空的时候,从队中取出一个事件
r = (Runnable) queue.removeFirst();
}
try {
// logger.info("begin to run the runnable");
// 执行这个事件
r.run();
Thread tt = new Thread();
} catch (Throwable e) {
// You might want to log something here
// 所有的异常全忽略
logger.error(
"there are a runtime exception in run the runable",
e);
}
}
}
}
}
分享到:
相关推荐
windows 版本的一个线程池实现,支持普通任务,定时任务,可以保证排队的任务正确释放-ThreadPool
Windows下一个比较完美的线程池实现和示例 本线程池提供了如下功能: 1.能根据任务个数和当前线程的多少在最小/最大线程个数之间自动调整(Vista后的系统有 SetThreadpoolThreadMaximum 等函数有类似功能); 2.能方便...
这是一个简单线程池的实现,虽然有很多bug,但是能够简单地实现线程池。
这是一个很简单的线程池实现 适合刚开始研究线程池的朋友
Java中的另一个线程池实现。 该线程池将创建给定数量的工作线程并将它们全部空闲。 可以将任务作为可运行对象分配给池。 如果有一个空闲的工作程序,它将立即执行可运行程序。 如果不是,则将可运行对象添加到队列...
C语言线程池实现实例
主要介绍了Django异步任务线程池实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java版线程池实现
前段时间发布了《Windows下一个比较完美的线程池实现和示例》(http://download.csdn.net/detail/fishjam/5106672),根据下载量和评论来看,对大家还比较有用。 现在发布一个利用该线程池实现的Http上传下载实现,...
简易的C++11线程池实现,线程池为固定方式,后面会新增非固定模式。
易语言简易线程池的实现。 ——V雪落有声V原创。转载请保留。前文:。为了能充分理解本篇文章的内容,需要了解的知识如下:。1.事件对象的使用:http://baike.baidu.com/view/751499.htm。2.信号量的使用:...
socket服务端线程池实现 不依赖于第三方jar,基于jdk编写。
Windows自带的线程池的实现
该文档为c++开发的线程池,可以作为参考
线程池原理及创建(C++实现)线程池原理及创建(C++实现)线程池原理及创建(C++实现)线程池原理及创建(C++实现)
linux下通过200行C代码实现简单线程池,附源代码和文档说明: 200行C代码实现简单线程池.doc threadpool.c
一个通用的线程池实现代码,该代码即可以在Windows环境下运行,也可以在Linux环境下运行。
一个完整的linux下socket通信及线程池的管理,可编译运行。
这是一个使用c++实现的线程池的源代码,在WIN以及UNIX环境下都可以使用
C++线程池实现 vc2015编译