- 浏览: 289816 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenchangqun:
这段示例代码没有客户端 没法实验
Java NIO原理和使用 -
congjl2002:
误,整理好了在发phk070832 写道垃圾代码,一大推的编译 ...
snmp trap的接收(jdmk方式) -
phk070832:
垃圾代码,一大推的编译错误,整理好了在发表吧。
snmp trap的接收(jdmk方式) -
zhangcctao:
我也遇到线程池的内存溢出问题。。不知道是不是这个原因呀?
多线程中使用静态方法 -
新入职:
分享了,这个eclise版本有没有讲究?我的3.3的可以么
windows下安装android及eclipse配置
从前面的文章可以看出,jdk1.5为我们提供了很多线程池
这里做一下简要的说明:
类Executors,提供了一些创建线程池的方法
newFixedThreadPool(int nThreads)
创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程。
如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。
newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。
调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。
终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。
注意,可以使用 ThreadPoolExecutor类
构造方法创建具有类似属性但细节不同,(例如超时参数)的线程池。
其实executors的线程池也是基于ThreadPoolExecutor扩展的。
newSingleThreadExecutor()
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,
一个新线程将代替它执行后续的任务)。
可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。
(与其他等效的 newFixedThreadPool(1) 不同,
可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。)
类ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize
- 池中所保存的线程数,包括空闲线程。 maximumPoolSize
- 池中允许的最大线程数。ThreadPoolExecutor 将根据 corePoolSize和 maximumPoolSize设置的边界自动调整池大小。
当新任务在方法 execute(java.lang.Runnable)
中提交时,
如果运行的线程少于corePoolSize,则创建新线程来处理请求,即使其他辅助线程是空闲的。
如果运行的线程多于corePoolSize 而少于maximumPoolSize,则仅当队列满时才创建新线程。
如果设置的corePoolSize 和maximumPoolSize 相同,则创建了固定大小的线程池。
如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),
则允许池适应任意数量的并发任务。
在大多数情况下,核心和最大池大小仅基于构造来设置,不过也可以使用 setCorePoolSize(int)
和
setMaximumPoolSize(int)
进行动态更改。
默认情况下,即使核心线程也只是在新任务需要时才创建和启动的。
threadFactory - 执行程序创建新线程时使用的工厂
使用 ThreadFactory
创建新线程。
如果没有另外说明,则在同一个ThreadGroup
中一律使用Executors.defaultThreadFactory()
创建线程,
并且这些线程具有相同的 NORM_PRIORITY 优先级和非守护进程状态。
通过提供不同的ThreadFactory,可以改变线程的名称、线程组、优先级、守护进程状态,等等。
如果从 newThread 返回 null 时 ThreadFactory 未能创建线程,则执行程序将继续运行,但不能执行任何任务。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
(保持活动时间)
unit - keepAliveTime 参数的时间单位。
如果池中当前有多于corePoolSize的线程,则这些多出的线程在空闲时间超过keepAliveTime时将会终止。
这提供了当池处于非活动状态时减少资源消耗的方法。
如果池后来变得更为活动,则可以创建新的线程。
也可以使用方法 setKeepAliveTime(long, java.util.concurrent.TimeUnit)
动态地更改此参数。
使用 Long.MAX_VALUE TimeUnit.NANOSECONDS
的值在关闭前有效地从以前的终止状态禁用空闲线程。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。
所有BlockingQueue
都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:
1.如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。
2.如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。
3.如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,
在这种情况下,任务将被拒绝。
排队有三种通用策略:
1.直接提交。工作队列的默认选项是 SynchronousQueue
,它将任务直接提交给线程而不保持它们。
在此,如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败,因此会构造一个新的线程。
此策略可以避免在处理可能具有内部依赖性的请求集合时出现锁定。
直接提交通常要求无界 maximumPoolSizes 以避免拒绝新提交的任务。
当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。
2.无界队列。使用无界队列(例如,不具有预定义容量的 LinkedBlockingQueue
)
将导致在所有 corePoolSize 线程都忙的情况下将新任务加入队列。
这样,创建的线程就不会超过 corePoolSize。(因此,maximumPoolSize 的值也就无效了。)
当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列;例如,在 Web 页服务器中。
这种排队可用于处理瞬态突发请求,当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。
3.有界队列。当使用有限的 maximumPoolSizes 时,
有界队列(如 ArrayBlockingQueue
)有助于防止资源耗尽,但是可能较难调整和控制。
队列大小和最大池大小可能需要相互折衷:
使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,
但是可能导致人工降低吞吐量。
如果任务频繁阻塞(例如,如果它们是 I/O 边界),
则系统可能为超过您许可的更多线程安排时间。
使用小型队列通常要求较大的池大小,CPU 使用率较高,
但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序 (被拒绝的任务 )
当 Executor 已经关闭,并且 Executor 将有限边界用于最大线程和工作队列容量,且已经饱和时,
在方法 execute(java.lang.Runnable)
中提交的新任务将被拒绝。
在以上两种情况下,execute 方法都将调用其 RejectedExecutionHandler
的
RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)
方法。
下面提供了四种预定义的处理程序策略:
1.在默认的 ThreadPoolExecutor.AbortPolicy
中,处理程序遭到拒绝将抛出运行时 RejectedExecutionException
。
2.在 ThreadPoolExecutor.CallerRunsPolicy
中,线程调用运行该任务的 execute 本身。
此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
3. 在 ThreadPoolExecutor.DiscardPolicy
中,不能执行的任务将被删除。
4.在 ThreadPoolExecutor.DiscardOldestPolicy
中,如果执行程序尚未关闭,
则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)。
定义和使用其他种类的 RejectedExecutionHandler
类也是可能的,但这样做需要非常小心,
尤其是当策略仅用于特定容量或排队策略时。
这些只是jdk中的介绍,要想更好的使用线程池,就需要对这些参数有所了解。
发表评论
-
java阻塞队列学习(转帖)
2010-06-06 11:50 3471import java.util.concurrent.Arr ... -
httpclient链接关闭问题(转帖)
2010-03-11 22:09 2137HttpClient client = new HttpCli ... -
J2EE集群原理(转贴)
2010-03-09 19:57 1213J2EE集群原理 什么是集群呢?总的来说,集群包括两个概念: ... -
Spring 实现ibatis事务回滚
2010-03-05 20:34 3632网上发现这篇文章,转过来学习一下,好不好用还没有实践,需要自己 ... -
java 可变参数
2009-12-14 20:50 14128vararg的意思是变量参数,它是与Jav ... -
java中的string
2009-11-25 14:45 1308从javaeye的论坛里看到这 ... -
使用JDBC对BLOB和CLOB进行处理
2009-11-12 20:33 4849从网上看到这篇文章,转过来做为学习用 设有表:create ... -
避免或最小化 Servlet 中的同步
2009-09-24 21:02 973servlet 是多线程的。基于 servlet 的应用程序必 ... -
httpclient 使用小记
2009-09-03 21:05 3383最近学习apache的httpclient 在使用postm ... -
httpclient 学习笔记
2009-08-23 16:52 1530前阵子,学习了一下APACHE 的httpclient,感觉h ... -
log4j使用
2009-06-19 21:08 1546从网上看到得,发现写 ... -
java虚拟机的一些概念
2009-05-24 10:22 1339从网上看到这篇文章,感觉适合初学jvm,就转来作为以后学习参考 ... -
xmlbean 生成带包路径的jar
2009-05-23 23:12 3283因为使用xmlbean生成 ... -
多线程中使用静态方法
2009-05-14 19:54 6635终于把内存泄漏问题解决了,不是多线程访问静态函数的问题,事实证 ... -
java Annotation入门
2009-04-16 21:22 1246因为偶然的原因需要使用Annotation,所以从网上找了这篇 ... -
MINA2.0简单使用
2009-04-12 16:12 5136一直知道MINA是apache 开发的一个开发socket编程 ... -
log4j参数配置说明
2009-03-22 20:31 2001前几天用到log4j,到网上查了一下他的参数配置,发现还是比较 ... -
portal之SSO开发文档
2009-03-02 20:12 4057前两天看到别人写的,感觉不错,就转了过来做为参考 ... -
cas在tomcat中的配置
2009-02-25 21:22 2830cas在tomcat上配置时,需要打开tomc ... -
SSO 原理浅谈
2009-02-25 19:41 2109SSO 是一个非常大的主题,我对这个主题有着深深的感受,自从 ...
相关推荐
10. **线程并发库**:JDK5.0引入了`java.util.concurrent`包,提供了如`ExecutorService`、`Future`、`Semaphore`等高级并发工具,简化了多线程编程。 通过深入学习《良葛格JDK5.0学习笔记》,开发者能够全面了解并...
JDK 5.0加强了对多线程的支持,提供了一些新的工具,如jstack,用于分析线程状态,帮助开发者调试和解决死锁等问题。 十、内省增强(Introspection Enhancements) Java反射API在JDK 5.0中得到了增强,提供了对泛型...
《良葛格Java JDK 5.0学习笔记》是一份详尽的教程资源,旨在帮助开发者深入理解并掌握Java开发工具包(Java Development Kit)的第5个主要版本——JDK 5.0。这份笔记涵盖了JDK 5.0中的核心特性、改进和新功能,是...
《良葛格Java JDK 5.0学习笔记》是一份专为Java初学者及爱好者精心编写的教程,它深入浅出地介绍了Java编程语言的核心概念和技术。这份教材以JDK 5.0版本为基础,该版本是Java发展史上的一个重要里程碑,引入了许多...
9. **并发编程改进**:JDK 5.0引入了并发工具类,如`java.util.concurrent`包下的`ExecutorService`、`Future`、`Semaphore`等,以及`ThreadLocal`,增强了多线程编程的能力。 10. **内省(Introspection)**:JDK ...
良葛格的《Java JDK5.0学习笔记》是一本面向初学者的教程,旨在帮助读者掌握这个版本的核心概念和技术。以下是基于该书部分内容的知识点详解: 1. **泛型**:JDK 5.0引入了泛型,这是一种强大的类型系统增强,允许...