快速业务通道

J2SE5.0中的线程缓冲 ---- 线程池 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
              ThreadFactory threadFactory,                 RejectedExecutionHandler handler); }

J2SE5.0中的线程缓冲 ---- 线程池(2)

时间:2011-05-20

五、两个重要概念Sizes与Queues

Size

一个线程库创建后,其的大小在最小值(corePoolSize)与最大值(maximumPoolSize)之间,运行时可根据getPoolSize()确定其当前的大小。

Queue

队列用于存放等候执行的任务。

下面一步步分析这两个值在线程库的工作中是如何运作:

1.  ThreadPoolExecutor tpe = new ThreadPoolExecutor(M, N, TIMEOUT, TimeUnit.MILLISECONDS, 2.      new LinkedBlockingQueue<Runnable>()); 3. 4.    Task[] tasks = new Task[nTasks]; 5.    for (int i = 0; i < nTasks; i++) { 6.      tasks[i] = new Task(n, "Task " + i); 7.      tpe.execute(tasks[i]); 8.    } 9.    tpe.shutdown();

行1-2构造了一个线程库,M个core threads和N maximum threads,这时实际上并没有线程被创建。(可能过prestartAllCoreThreads() 和 prestartCoreThread() 方法分别预先创建)

第7行 一个任务被加入到线程库,这时下列5种情况之一将会发生:

如果库中的线程数少于M,线程库将立即启动一个新的线程来运行这个任务。即使库中有空闲的线程,仍然会产生一个新线程直到数量到达M。

如果库中的线程数在M和N之间,并且只少有一个是空闲线程,那么任务将由这个空闲线程执行。

如果库中的线程数在M和N之间,并且没有空闲线程,这时库会检查存在的工作队列,如果任务能够放置在队列中而不被阻塞,那么任务就会放置在该列队中,不会有新的线程启动。

如果库中的线程数在M和N之间,并且没有空闲线程,且任务不能无阻塞地加入到队列中,这时库会开始一个新线程来运行这个任务。

如果库中的线程数量已到达N且没有空闲线程,这时库将会试着放置新任务到一个队列。如果该队列已到达它的最大大小,任务将会被拒绝,添加失败,否则任务将被接受等待有空闲的线程来运行它。

一个任务执行完成,运行这个任务的线程将去运行队列中的下一个任务,如果队列中没有任务,将会发生下面两种情况之一:

如果库中的线程数大于M,线程将等待一个队列中有新的任务。如果队列中的新任务没有超时,该线程将运行这个任务,否则线程将退出以减少库中的线程数量。超时值是在新构造线程库时指定的TIMEOUT,如果TIMEOUT为0,不管库的最小大小(corePoolSize)是多少,线程执行完任务后总是退出。

如果库中的线程数量等于M或小于M,该线程将不确定地被阻塞以等待一个新的任务被加入到队列(除非TIMEOUT=0,它将退出),当它有效时就会运行这个新任务。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号