- 浏览: 92781 次
- 性别:
- 来自: 上海
最新评论
-
mthhk:
彩笔写上面博客
jquery dataTable ajax -
liuweihug:
推荐这个博客看看。Jquery DataTable基于Twit ...
jquery dataTable ajax -
dfwang:
daxiaoli123 写道ant 怎么搞代码统计啊需要使用第 ...
可持续集成测试 -
daxiaoli123:
ant 怎么搞代码统计啊
可持续集成测试 -
dfwang:
daxiaoli123 写道楼主如果包有依赖怎么办啊你的意思是 ...
可持续集成测试
最近面试被问到这个问题,正好找个线程池的实现代码,温习一下
/** 线程池类,工作线程作为其内部类 **/ package org.ymcn.util; import java.util.Collections; import java.util.Date; import java.util.LinkedList; import java.util.List; import org.apache.log4j.Logger; /** * 线程池 * 创建线程池,销毁线程池,添加新任务 * * @author obullxl */ public final class ThreadPool { private static Logger logger = Logger.getLogger(ThreadPool.class); private static Logger taskLogger = Logger.getLogger("TaskLogger"); private static boolean debug = taskLogger.isDebugEnabled(); // private static boolean debug = taskLogger.isInfoEnabled(); /* 单例 */ private static ThreadPool instance = ThreadPool.getInstance(); public static final int SYSTEM_BUSY_TASK_COUNT = 150; /* 默认池中线程数 */ public static int worker_num = 5; /* 已经处理的任务数 */ private static int taskCounter = 0; public static boolean systemIsBusy = false; private static List<Task> taskQueue = Collections .synchronizedList(new LinkedList<Task>()); /* 池中的所有线程 */ public PoolWorker[] workers; private ThreadPool() { workers = new PoolWorker[5]; for (int i = 0; i < workers.length; i++) { workers[i] = new PoolWorker(i); } } private ThreadPool(int pool_worker_num) { worker_num = pool_worker_num; workers = new PoolWorker[worker_num]; for (int i = 0; i < workers.length; i++) { workers[i] = new PoolWorker(i); } } public static synchronized ThreadPool getInstance() { if (instance == null) return new ThreadPool(); return instance; } /** * 增加新的任务 * 每增加一个新任务,都要唤醒任务队列 * @param newTask */ public void addTask(Task newTask) { synchronized (taskQueue) { newTask.setTaskId(++taskCounter); newTask.setSubmitTime(new Date()); taskQueue.add(newTask); /* 唤醒队列, 开始执行 */ taskQueue.notifyAll(); } logger.info("Submit Task<" + newTask.getTaskId() + ">: " + newTask.info()); } /** * 批量增加新任务 * @param taskes */ public void batchAddTask(Task[] taskes) { if (taskes == null || taskes.length == 0) { return; } synchronized (taskQueue) { for (int i = 0; i < taskes.length; i++) { if (taskes[i] == null) { continue; } taskes[i].setTaskId(++taskCounter); taskes[i].setSubmitTime(new Date()); taskQueue.add(taskes[i]); } /* 唤醒队列, 开始执行 */ taskQueue.notifyAll(); } for (int i = 0; i < taskes.length; i++) { if (taskes[i] == null) { continue; } logger.info("Submit Task<" + taskes[i].getTaskId() + ">: " + taskes[i].info()); } } /** * 线程池信息 * @return */ public String getInfo() { StringBuffer sb = new StringBuffer(); sb.append("\nTask Queue Size:" + taskQueue.size()); for (int i = 0; i < workers.length; i++) { sb.append("\nWorker " + i + " is " + ((workers[i].isWaiting()) ? "Waiting." : "Running.")); } return sb.toString(); } /** * 销毁线程池 */ public synchronized void destroy() { for (int i = 0; i < worker_num; i++) { workers[i].stopWorker(); workers[i] = null; } taskQueue.clear(); } /** * 池中工作线程 * * @author obullxl */ private class PoolWorker extends Thread { private int index = -1; /* 该工作线程是否有效 */ private boolean isRunning = true; /* 该工作线程是否可以执行新任务 */ private boolean isWaiting = true; public PoolWorker(int index) { this.index = index; start(); } public void stopWorker() { this.isRunning = false; } public boolean isWaiting() { return this.isWaiting; } /** * 循环执行任务 * 这也许是线程池的关键所在 */ public void run() { while (isRunning) { Task r = null; synchronized (taskQueue) { while (taskQueue.isEmpty()) { try { /* 任务队列为空,则等待有新任务加入从而被唤醒 */ taskQueue.wait(20); } catch (InterruptedException ie) { logger.error(ie); } } /* 取出任务执行 */ r = (Task) taskQueue.remove(0); } if (r != null) { isWaiting = false; try { if (debug) { r.setBeginExceuteTime(new Date()); taskLogger.debug("Worker<" + index + "> start execute Task<" + r.getTaskId() + ">"); if (r.getBeginExceuteTime().getTime() - r.getSubmitTime().getTime() > 1000) taskLogger.debug("longer waiting time. " + r.info() + ",<" + index + ">,time:" + (r.getFinishTime().getTime() - r .getBeginExceuteTime().getTime())); } /* 该任务是否需要立即执行 */ if (r.needExecuteImmediate()) { new Thread(r).start(); } else { r.run(); } if (debug) { r.setFinishTime(new Date()); taskLogger.debug("Worker<" + index + "> finish task<" + r.getTaskId() + ">"); if (r.getFinishTime().getTime() - r.getBeginExceuteTime().getTime() > 1000) taskLogger.debug("longer execution time. " + r.info() + ",<" + index + ">,time:" + (r.getFinishTime().getTime() - r .getBeginExceuteTime().getTime())); } } catch (Exception e) { e.printStackTrace(); logger.error(e); } isWaiting = true; r = null; } } } } } /** 任务接口类 **/ package org.ymcn.util; import java.util.Date; /** * 所有任务接口 * 其他任务必须继承访类 * * @author obullxl */ public abstract class Task implements Runnable { // private static Logger logger = Logger.getLogger(Task.class); /* 产生时间 */ private Date generateTime = null; /* 提交执行时间 */ private Date submitTime = null; /* 开始执行时间 */ private Date beginExceuteTime = null; /* 执行完成时间 */ private Date finishTime = null; private long taskId; public Task() { this.generateTime = new Date(); } /** * 任务执行入口 */ public void run() { /** * 相关执行代码 * * beginTransaction(); * * 执行过程中可能产生新的任务 subtask = taskCore(); * * commitTransaction(); * * 增加新产生的任务 ThreadPool.getInstance().batchAddTask(taskCore()); */ } /** * 所有任务的核心 所以特别的业务逻辑执行之处 * * @throws Exception */ public abstract Task[] taskCore() throws Exception; /** * 是否用到数据库 * * @return */ protected abstract boolean useDb(); /** * 是否需要立即执行 * * @return */ protected abstract boolean needExecuteImmediate(); /** * 任务信息 * * @return String */ public abstract String info(); public Date getGenerateTime() { return generateTime; } public Date getBeginExceuteTime() { return beginExceuteTime; } public void setBeginExceuteTime(Date beginExceuteTime) { this.beginExceuteTime = beginExceuteTime; } public Date getFinishTime() { return finishTime; } public void setFinishTime(Date finishTime) { this.finishTime = finishTime; } public Date getSubmitTime() { return submitTime; } public void setSubmitTime(Date submitTime) { this.submitTime = submitTime; } public long getTaskId() { return taskId; } public void setTaskId(long taskId) { this.taskId = taskId; } }
发表评论
-
configuration
2012-04-26 15:10 929无聊写点sample,供以后抄袭 JNDI方式 1、Spr ... -
可持续集成测试
2012-04-24 13:26 2355最近在搞可持续集成测试,顺便写个小例子以后方便参考 目录结构 ... -
运用RUP 4+1视图方法进行软件架构设计
2012-02-07 13:54 1045http://www.ibm.com/developerwor ... -
代理模式,动态代理
2011-12-09 16:31 968一、先看个普通代理模式的例子: 1.接口类 package ... -
jqGrid ajax 互搞,json object 互搞
2011-11-29 16:52 4769今天玩了玩jqGrid,贴点代码出来,以后方便copy jqG ... -
读properties文件
2011-11-24 11:25 1141太无聊了,写个读properties文件的类方便以后直接cop ... -
TOMCAT 配置及性能优化
2011-11-15 11:05 1073参考资料:1.http://blog.sina.com.cn/ ... -
AOP面向切面编程
2011-11-11 13:40 887转载: http://wayfarer.cnblogs.com ... -
Spring 事务管理
2011-10-26 09:31 971文章转自:【http://blog.c ... -
HttpServletRequestWrapper 学习
2011-10-20 09:17 1530使用过滤器不能改变HttpServletRequest对象的参 ... -
JNDI Sample
2011-10-13 09:06 902public class TestJb ... -
Build an Apache Wink REST service(一)
2011-10-12 09:30 1254Apache Wink service configurati ... -
jquery dataTable ajax
2011-09-16 15:32 15554dataTable 插件的相关api: http://www. ... -
BodyTagSupport 学习
2011-09-15 10:52 1232BodyTagSupport类的方法: 编写标签对应的实现类时 ... -
DataTables Ajax 回调函数
2011-09-08 12:53 7060<!DOCTYPE HTML PUBLIC &quo ... -
Mybatis 学习转
2011-09-07 14:46 1872Mybatis缓存系列 在sqlMap文件中加入cacheMo ... -
Spring3MVC+ajax
2011-07-11 17:03 736随便玩了玩springMVC3 + ajax 帖下代码和目录结 ... -
quartz的时间设置
2011-06-22 15:52 1201格式: [秒] [分] [小时] [日] [月] [周] [年 ... -
转:解决 java.util.MissingResourceException: Can't find bundle for base name com...c
2011-05-10 14:25 2401转:解决 java.util.MissingResourceE ... -
Stripes1.5.6+Spring3.05+Spring Security3.0.5 环境搭建(一)
2011-04-28 12:48 2469该部分的环境搭建基于Spring Security URL的拦 ...
相关推荐
threadpool实现方式 threadpool实现方式 threadpool实现方式
ThreadPool 线程池管理单元 带调用例子
C++11 线程池 ThreadPool 单例 线程池,实现全局唯一。
使用Boost库,Threadpool线程池的使用,包括优先级任务处理,普通任务处理!
threadPool的实现代码
线程池threadpool_src,非常实用的线程池代码,好用方便!
threadpool_src.zip
C# Thread、ThreadPool、Task测试,三者创建、启动的方法
本代码为C++11实现ThreadPool的功能。经典的线程池C++代码,可让阅读者深刻了解线程池的调度管理等。
利用线程池来ThreadPool.QueueUserWorkItem来处理多线程问题,本人也是初学着,欢迎大家多多来探讨多线程的技术问题..
boost threadpool-0_2_5-src ,修复内存泄露后的版本
javascript ThreadPool
boost库就不介绍了,网上很容易查到,这个threadpool 是基于boost库的半官方实现,使用方法请参照博客http://blog.csdn.net/yuguanquan1990/article/details/39899853
rust-threadpool, 用于并行任务执行的非常简单的线程池 线程管理线程池,用于在一组固定工作线程上运行许多作业。 用法将这个添加到你的Cargo.toml:[dependencies]threadpool = "1.0"这是你的箱子 root:extern c
threadpool线程池学习
一个VC++ThreadPool程序,结构清晰,程序优先,注释详细,方便使用!