典型Java线程池的代码及其各部分功能介绍

典型Java线程池的代码及其各部分功能介绍,第1张

( )根据xml文件来管理线程池的最大最小线程数( )对线程池通过Timer定期扫描以防止线程未激活 ( )通过某一个变量(本程序中是freeThreadCount)来得到空闲线程的数目 一 配置xml(listen xml)是 <?xml version= encoding= UTF ?><config><ConsumeThreadPool><minPools></minPools> <! 线程池最小线程 ><maxPools></maxPools><! 线程池最大线程 ><checkThreadPeriod></checkThreadPeriod> <! 检查线程池中线程的周期 分钟 ></ConsumeThreadPool></config> 二 对于ConsumeThreadPoolPara的javabean: import java io *public class ConsumeThreadPoolPara implements Serializable{private int minPoolsprivate int maxPoolsprivate int checkThreadPeriodpublic 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 consumeThreadPool = new ConsumeThreadPoolPara()}} 三 解析xml程序代码(生成ConsumeThreadPoolPara) 使用jdom解析 import jdom *import jdom input SAXBuilderimport java io *import java util *public class ParseConfig {static Hashtable Listens = nullstatic ConnPara connpara = nullstatic ConsumeThreadPoolPara consumeThreadPoolPara = nullprivate 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) </p>* <p>Company: </p>* @author 张荣斌* @version */public class ThreadPool {private static int minPools = //最小连接池数目private static int maxPools = //最大连接池数目private static int checkThreadPeriod = //检查连接池的周期ArrayList m_ThreadList //工作线程列表LinkedList m_RunList = null //工作任务列表int totalThread =  //总线程数static int freeThreadCount =  //未被使用的线程数目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()* * }}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= i<minPoolsi++){WorkerThread temp=new WorkerThread()totalThread = totalThread + m_ThreadList add(temp)temp start()try{Thread sleep( )}catch(Exception e){}}timer = new Timer(true) //启动定时器timer schedule(new CheckThreadTask(this) checkThreadPeriod)}/*** 当有一个工作来的时候启动线程池的线程* 当空闲线程数为 的时候 看总线程是否小于最大线程池的数目 就new一个新的线程 否则sleep 直到有空闲线程为止* 当空闲线程不为 则将任务丢给空闲线程去完成* @param work*/public synchronized void run(String work){if (freeThreadCount == ) {if(totalThread<maxPools){WorkerThread temp = new WorkerThread()totalThread = totalThread + m_ThreadList add(temp)temp start()synchronized(m_RunList){m_RunList add(work)m_RunList notify()}}else{while (freeThreadCount == ) {try {Thread sleep( )}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 = erator()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 */class WorkerThread extends Thread{boolean running = trueString workpublic void run(){while(running){synchronized(o){freeThreadCount++}synchronized(m_RunList){while(m_RunList size() == ){try{m_RunList wait()if(!running) return}catch(InterruptedException e){}<lishixinzhi/Article/program/Java/gj/201311/27379

找的资料,你看一下吧:\x0d\x0a多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。\x0d\x0a\x0d\x0a假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。\x0d\x0a\x0d\x0a如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。\x0d\x0a一个线程池包括以下四个基本组成部分:\x0d\x0a1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;\x0d\x0a2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;\x0d\x0a3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;\x0d\x0a4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。\x0d\x0a\x0d\x0a线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。\x0d\x0a\x0d\x0a线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目,看一个例子:\x0d\x0a\x0d\x0a假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。

java常用的线程池有三种:

1.

newFixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。

参数:

nThreads - 池中的线程数

返回:

新创建的线程池

抛出:

IllegalArgumentException - 如果 nThreads <= 0

2.

newSingleThreadExecutor

public static ExecutorService newSingleThreadExecutor()创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

返回:

新创建的单线程 Executor

3.

newCachedThreadPool

public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。

返回:

新创建的线程池


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9886386.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存