个人博客已经迁移到如下网站 萌萌的IT人, 后续所有的文章都会在此发布
----------------------------------------------------------------------------------
(1)根据xml文件来管理线程池的最大最小线程数
(2)对线程池通过Timer定期扫描以防止线程未激活;
(3)通过某一个变量(本程序中是freeThreadCount)来得到空闲线程的数目;
一、配置xml(listen.xml)是:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<ConsumeThreadPool>
<minPools>10</minPools> <!--线程池最小线程-->
<maxPools>100</maxPools> <!--线程池最大线程-->
<checkThreadPeriod>5</checkThreadPeriod> <!--检查线程池中线程的周期5分钟-->
</ConsumeThreadPool>
</config>
二、对于ConsumeThreadPoolPara的javabean: import java.io.*; public class ConsumeThreadPoolPara implements Serializable{ private int minPools; private int maxPools; private int checkThreadPeriod; public int getMinPools(){ return minPools; } public int getMaxPools(){ return maxPools; } public int getCheckThreadPeriod(){ return checkThreadPeriod; } public void setMinPools(int minPools){ this.minPools = minPools; } public void setMaxPools(int maxPools){ this.maxPools = maxPools; } public void setCheckThreadPeriod(int checkThreadPeriod){ this.checkThreadPeriod = checkThreadPeriod; } public String toString(){ return minPools+" " + maxPools+" "+checkThreadPeriod; } public ConsumeThreadPoolPara() { } public static void main(String[] args) { ConsumeThreadPoolPara consumeThreadPool1 = new ConsumeThreadPoolPara(); } } 三、解析xml程序代码(生成ConsumeThreadPoolPara): 使用jdom解析: import org.jdom.*; import org.jdom.input.SAXBuilder; import java.io.*; import java.util.*; public class ParseConfig { static Hashtable Listens = null; static ConnPara connpara = null; static ConsumeThreadPoolPara consumeThreadPoolPara = null; private static String configxml = "listen.xml"; static{ getConsumeThreadPoolPara(); //得到消费的线程池的参数 } /** * 装载文档 * @return 返回根结点 * @throws JDOMException */ public static Element loadDocument() throws JDOMException{ SAXBuilder parser = new SAXBuilder(); // 新建立构造器 try { Document document = parser.build(configxml); Element root = document.getRootElement(); return root; }catch(JDOMException e){ logger.error("listen.xml文件格式非法!"); throw new JDOMException(); } } public static ConsumeThreadPoolPara getConsumeThreadPoolPara(){ if(consumeThreadPoolPara ==null){ try { Element root = loadDocument(); Element consumeThreadPool = root.getChild("ConsumeThreadPool"); if (consumeThreadPool != null) { //代表有数据库配置 consumeThreadPoolPara = new ConsumeThreadPoolPara(); Element minPools = consumeThreadPool.getChild("minPools"); consumeThreadPoolPara.setMinPools(Integer.parseInt(minPools.getTextTrim())); Element maxPools = consumeThreadPool.getChild("maxPools"); consumeThreadPoolPara.setMaxPools(Integer.parseInt(maxPools.getTextTrim())); Element checkThreadPeriod = consumeThreadPool.getChild("checkThreadPeriod"); consumeThreadPoolPara.setCheckThreadPeriod(Integer.parseInt(checkThreadPeriod.getTextTrim())); } } catch (JDOMException e) { } } return consumeThreadPoolPara; } } 四、线程池源代码: import java.util.*; /** * <p>Title: 线程池</p> * <p>Description: 采集消费模块</p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: </p> * @author 张荣斌 * @version 1.0 */ public class ThreadPool { private static int minPools = 10; //最小连接池数目 private static int maxPools = 100; //最大连接池数目 private static int checkThreadPeriod = 5; //检查连接池的周期 ArrayList m_ThreadList; //工作线程列表 LinkedList m_RunList = null; //工作任务列表 int totalThread = 0; //总线程数 static int freeThreadCount = 0; //未被使用的线程数目 private java.util.Timer timer = null; //定时器 static Object o = new Object(); static{ //先初始化线程池的参数 ConsumeThreadPoolPara consumeThreadPoolPara = ParseConfig.getConsumeThreadPoolPara(); if(consumeThreadPoolPara!=null){ minPools = consumeThreadPoolPara.getMinPools(); maxPools = consumeThreadPoolPara.getMaxPools(); checkThreadPeriod = consumeThreadPoolPara.getCheckThreadPeriod()*60*1000; } } public void setMinPools(int minPools){ this.minPools = minPools; } public void setMaxPools(int maxPools){ this.maxPools = maxPools; } public void setCheckThreadPeriod(int checkThreadPeriod){ this.checkThreadPeriod = checkThreadPeriod; } public ThreadPool() { m_ThreadList=new ArrayList(); m_RunList=new LinkedList(); for(int i=0;i<minPools;i++){ WorkerThread temp=new WorkerThread(); totalThread = totalThread + 1; m_ThreadList.add(temp); temp.start(); try{ Thread.sleep(100); }catch(Exception e){ } } timer = new Timer(true); //启动定时器 timer.schedule(new CheckThreadTask(this),0,checkThreadPeriod); } /** * 当有一个工作来的时候启动线程池的线程 * 1.当空闲线程数为0的时候,看总线程是否小于最大线程池的数目,就new一个新的线程,否则sleep,直到有空闲线程为止; * 2.当空闲线程不为0,则将任务丢给空闲线程去完成 * @param work */ public synchronized void run(String work) { if (freeThreadCount == 0) { if(totalThread<maxPools){ WorkerThread temp = new WorkerThread(); totalThread = totalThread + 1; m_ThreadList.add(temp); temp.start(); synchronized(m_RunList){ m_RunList.add(work); m_RunList.notify(); } }else{ while (freeThreadCount == 0) { try { Thread.sleep(200); } catch (InterruptedException e) { } } synchronized(m_RunList){ m_RunList.add(work); m_RunList.notify(); } } } else { synchronized(m_RunList){ m_RunList.add(work); m_RunList.notify(); } } } /** * 检查所有的线程的有效性 */ public synchronized void checkAllThreads() { Iterator lThreadIterator = m_ThreadList.iterator(); while (lThreadIterator.hasNext()) { //逐个遍厉 WorkerThread lTestThread = (WorkerThread) lThreadIterator.next(); if (! (lTestThread.isAlive())) { //如果处在非活动状态时 lTestThread = new WorkerThread(); //重新生成个线程 lTestThread.start(); //启动 } } } /** * 打印调试信息 */ public void printDebugInfo(){ System.out.println("totalThread="+totalThread); System.out.println("m_ThreadList.size()="+m_ThreadList.size()); } /** * * <p>Title: 工作线程类</p> * @author 张荣斌 * @version 1.0 */ class WorkerThread extends Thread{ boolean running = true; String work; public void run(){ while(running){ synchronized(o){ freeThreadCount++; } synchronized(m_RunList){ while(m_RunList.size() == 0){ try{ m_RunList.wait(); if(!running) return; }catch(InterruptedException e){ }< 文章转载自网管网:http://www.bitscn.com/plus/view.php?aid=21582
相关推荐
java 线程池 完整 源码 java 线程池 完整 源码
NULL 博文链接:https://yulincqupt.iteye.com/blog/1673919
本文旨在使用Java语言编写一个通用的线程池。当需要使用线程池处理事务时,只需按照指定规范封装好事务处理对象,然后用已有的线程池对象去自动选择空 闲线程自动调用事务处理对象即可。并实现线程池的动态修改...
简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类
Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6] ...
主要给大家介绍了关于java线程池使用后到底要不要关闭的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java 线程池 java 线程池 java 线程池 java 线程池
[JAVA][线程池]例子
2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来...
java线程池知识、
Java线程池使用说明Java线程池使用说明Java线程池使用说明
java线程池封装j
线程池是一种线程使用模式。在线程池中维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。使用线程池不仅能够保证内核的充分利用,还能防止过分调度。WEB...
构建线程池,提高线程访问速度,非常经典,非常好的原代码
讲述了java线程池的优点,参数,6种线程池的使用场景,线程池用到的handler,线程任务的提交方式等等。
java线程池实例java线程池实例E:\Users\Administrator\workspace
JAVA线程池原理以及几种线程池类型介绍
java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java...
java 线程池 学习代码,想学线程池的可以参考一下
自定义实现Java线程池,学习大师设计思想,瞻仰大神笔法