我的线程池代码

原创 2004年09月09日 22:19:00

(1)根据xml文件来管理线程池的最大最小线程数
(2)对线程池通过Timer定期扫描以防止线程未激活;
(3)通过某一个变量(本程序中是freeThreadCount)来得到空闲线程的数目;

一、配置xml(listen.xml)是:
<?xml version="1.0" encoding="UTF-8"?>
?
???
??? ???? 10?????
??????????? 100???????
??????????? 5?
???
?

二、对于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.*;

/**
?*

Title: 线程池


?*

Description: 采集消费模块


?*

Copyright: Copyright (c) 2004


?*

Company:


?* @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??????? 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??????????????????? 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());
}

????? /**
?????? *
?????? *

Title: 工作线程类


?????? * @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){
?????????????????????? }
????????????????? }
????????????????? synchronized(o){
??????????????????? freeThreadCount--;
????????????????? }
????????????????? work = (String)m_RunList.removeLast();
????????????????? if(work==null) return;
??????????????? }

??// 得到了work 进行工作,这里work可以换成自己的工作类
????????????? }
??????????? }
}

}
??????? /**
???????? *
???????? *

Title: 定时器调动的任务


???????? * @author 张荣斌
???????? * @version 1.0
???????? */
??????? class CheckThreadTask extends TimerTask{
????????? private static boolean isRunning = false;
????????? private ThreadPool pool;

????????? public CheckThreadTask(ThreadPool pool){
??????????? this.pool = pool;
????????? }
????????? public void run() {
??????????? if (!isRunning)? {
????????????? isRunning = true;
????????????? pool.checkAllThreads();
????????????? isRunning = false;
??????????? }
????????? }
??????? }

代码代码代码&nbsp;连睡觉都梦到代码

连睡觉都梦到代码" TITLE="代码代码代码 连睡觉都梦到代码" />代码代码代码 连睡觉都梦到代码   连睡觉都梦到代码" TITLE="代码代码代码 连睡觉都梦到代码" />连睡觉都梦到...
  • jiangbuku
  • jiangbuku
  • 2013年10月17日 13:19
  • 355

什么是代码?

代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。代码设计的原则包括惟一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求...
  • axl19530209
  • axl19530209
  • 2014年11月10日 11:38
  • 365

什么样的代码才算得上是好代码

什么样的代码才是好代码?衡量代码的好坏的指标或者维度有很多,比如性能好、架构好、高内聚等,这些指标的侧重点各不相同,不同的开发人员的关注的重点也各不相同。我个人更喜欢简单的可读性高的代码,我主要从以下...
  • baidu_36847344
  • baidu_36847344
  • 2017年03月14日 20:26
  • 629

[代码][CSS]代码

1. [代码][CSS]代码     01 html判断IE版本 02 1. 除IE外都可识别 03 2...
  • ft2166826
  • ft2166826
  • 2013年12月26日 10:58
  • 244

好代码是廉价的代码

长久以来我一直主张:好代码是廉价的代码。 当我跟做开发的同事说出这话时,他们的第一反应是一种惊愕,然后是将近一个星期的嘲笑,把它当作一个笑话来讲。 当他们走近看我的表情、知道我是认真的时,才收敛...
  • u013700340
  • u013700340
  • 2014年08月02日 14:55
  • 412

代码测试之代码调试

代码测试是我们开发过程中很重要的一步。很多新入行的朋友都会习惯地认为测试只是测试部门的工作,事实上并不是这样。每一位软件工程师对应该本着对自己代码负责的态度,在入库或者进行集成测试之前对自己的代码进行...
  • kenhe_liao
  • kenhe_liao
  • 2013年05月22日 17:04
  • 303

代码优化--死代码

程序的完整编译过程分为是:预处理,编译,汇编等,如下关于编译阶段的编译优化的说法中不正确的是() A、死代码删除指的是编译过程直接抛弃掉被注释的代码; B、函数内联可以避免函数调用中压栈和退栈的开销...
  • dongyanxia1000
  • dongyanxia1000
  • 2017年01月25日 15:44
  • 448

关于如何写代码和学习代码

一: 1.0当写完一大代码以后,编译程序时是一大堆的错误(原因:语法不熟悉) --这个时候需要很大的耐心以及细心,对每一行代码仔细阅读和更改。改动代码的过程中能够极大的培养自己对代码的理解能力。常...
  • qq_37161280
  • qq_37161280
  • 2017年05月20日 08:55
  • 121

代码规范与代码复审

在第9章中,同学们完成了WC程序,经过评比,九条的程序获得了第一名。这时,阿超说,现代软件产业经过几十年的发展,已经不可能出现一个人单枪匹马完成一个软件的事情了,软件都是在相互合作中完成的。阿超建议大...
  • hengfanz
  • hengfanz
  • 2015年03月25日 22:40
  • 302

本地代码?托管代码?

(还有4天过年,我要回家我要回家--!)   昨天还有个家伙来问我一些问题,还问了工资,这让我尴尬得… 首先,我觉得问问题是个艺术吧。我比较反感那些人把问问题当成勤奋好学的依据,因为一些问题确实...
  • gyj0754
  • gyj0754
  • 2013年02月05日 10:42
  • 488
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我的线程池代码
举报原因:
原因补充:

(最多只允许输入30个字)