Java版线程池实现

上传人:大米 文档编号:495562455 上传时间:2023-04-06 格式:DOC 页数:30 大小:152.50KB
返回 下载 相关 举报
Java版线程池实现_第1页
第1页 / 共30页
Java版线程池实现_第2页
第2页 / 共30页
Java版线程池实现_第3页
第3页 / 共30页
Java版线程池实现_第4页
第4页 / 共30页
Java版线程池实现_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《Java版线程池实现》由会员分享,可在线阅读,更多相关《Java版线程池实现(30页珍藏版)》请在金锄头文库上搜索。

1、Java版线程池实现线程池调度技术原理:packagetest.threadpool;importjava.util.*;importtest.cfg.*;privateintreserve=i0;/保留线程privateintminPools=10;/最小连接池数目,预启动线程数目privateintmaxActive=70;/最多活动线程数目privateintmaxPools=100;/最大连接池数目privateintcheckThreadPeriod=5;/检查连接池的周期ArrayListm_ThreadList;/工作线程列表class/保留线程链表ArrayListm_Rese

2、rveList;ThreadPoolpublicintLinkedListmRunListfreeThreadCount0;/null;/工作任务列表未被使用的线程数目privatejava.util.Timertimer=null;定时器staticObjecto=newObject。;publicvoidsetMinPools(intminPools)this.minPools=minPools;publicvoidsetMaxPools(intmaxPools)this.maxPools=maxPools;checkThreadPeriod)publicvoidsetCheckThrea

3、dPeriod(intthis.checkThreadPeriod=checkThreadPeriod;/*初始化线程池,由于各个线程启动的时候是有一定的时间间隔,启动的时候会有定的时间*/publicThreadPool()/reserve=Integer.parseInt(FtpConfig.getValue(reserve);/从配置文件中获取参数/minPools=Integer.parseInt(FtpConfig.getValue(minPools);/从配置文件中获取参数/maxActive=Integer.parseInt(FtpConfig.getValue(maxActiv

4、e);/从配置文件中获取参数/maxPools=Integer.parseInt(FtpConfig.getValue(maxPools);/从配置文件中获取参数/checkThreadPeriod=Integer.parseInt(FtpConfig/.getValue(monitorPeriod)*60*1000;/以分为轮询单位m_ThreadList=newArrayList();/初始化工作线程链表m_ReserveList=newArrayList();m_RunList=newLinkedList();/初始化任务列表ArrayListlist=null;if(reserve0)

5、list=(ArrayList)FtpConfig.getProValueList(reserveList;for(inti=0;ireserve;i+)/启动保留线程,根据配置链表中的线程列表启动对应的保留线程.保存的是线程的全路径/classnametryThreadthr=(Thread)Class.forName(String)list.get(i).newlnstance();m_ReserveList.add(i,thr);thr.start();Thread.sleep(IO);catch(Exceptione)e.printStackTrace();for(inti=0;imi

6、nPools;i+)/初始化空闲线程WorkerThreadtemp=newWorkerThread();m_ThreadList.add(temp);/将线程添加到线程链表中temp.start();/启动工作线程tryThread.sleep(10);/每个100us启动一个线程catch(Exceptione)printDebuglnfo();timer=newTimer(true);/启动定时器timer.schedule(newCheckThreadTask(this),0,checkThreadPeriod);/设置定时器调度线程池*应用程序调用入口,可以是一个封装好的job类,具

7、体视应用而定*paramwork*/publicsynchronizedvoidrun(Objectwork)synchronized(m_RunList)/添加任务到任务链表中m_RunList.add(work);m_RunList.notify();*monitor所要采取的动作(轮询)*/publicsynchronizedvoidcheckAIIThreads()printDebugInfo();/如果空闲线程数少于预启动线程数目,并且没有达到最大的活动线程数时则增加空闲线程if(freeThreadCountminPools&m_ThreadList.size()(maxActiv

8、e-m_ThreadList.size()?(maxActive-m_ThreadList.size()minPools-freeThreadCount);for(inti=0;iminPools&(m_ThreadList.size()maxActive)intcount=(freeThreadCount-minPools)(m_ThreadList.size()-maxActive)?(freeThreadCount-minPools)freeThreadCount-minPools);for(inti=m_ThreadList.size()-1;i=0&count0;i-,count-)

9、WorkerThreadthr=(WorkerThread)m_ThreadList.get(i);if(thr!=null&thr.isdo)continue;if(thr!=null)synchronized(o)m_ThreadList.remove(i);trythr.stop();/销毁线程catch(Exceptione)e.printStackTrace();freeThreadCount-;for(inti=O;i=0;i-)Threadthr=(Thread)m_ReserveList.get(i);if(thr!=null&!(thr.isAlive()m_ReserveL

10、ist.remove(i);trythr.destroy();/销毁原先的线程thr.stop();FtpConfig.thr=(Thread)Class.forName(String)getProValueList(reserveList.get(i).newlnstance();去除原先的对象m_ReserveList.remove(i);/m_ReserveList.set(i,thr);thr.start();catch(Exceptione)e.printStackTrace();/*打印调试信息*/publicvoidprintDebuglnfo()+mThreadList.siz

11、efreeThreadCount);System.out.println(m_ThreadList.size()=();System.out.println(freeThreadCount/*获取任务链表*return*/publicLinkedListgetRunList()returnm_RunList;/*增加空闲线程数目*/publicvoidaddFreeThreadCount()synchronized(o)freeThreadCount+;/*减少空闲线程数目*/publicvoiddelFreeThreadCount()synchronized(o)freeThreadCoun

12、t-;classWorkerThreadextendsThreadbooleanrunning=true;booleanisdo=false;Stringwork;publicWorkerThread()setDaemon(false);/设置线程为精灵线程*设置线程的运行状态*paramstate*/state)publicsynchronizedvoidsetRunState(booleanthis.running=state;/*获取线程运行状态*return*/publicsynchronizedbooleangetlsdo()returnisdo;publicvoidrun()while(running)synchronized(o)freeThreadCount+;synchronized(m_R

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号