快速业务通道

Java理论与实践: 并发在一定程度上使一切变得简单 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
空白

核心 Java 类库中略去了一组有用的高级同步工具(譬如互斥、信号和阻塞 、线程安全集合类)。Java 语言的并发原语 ― synchronization 、 wait() 和 notify() ― 对于大多数服务器应用程序的需求而言过于低级。如果要试图 获取锁,但如果在给定的时间段内超时了还没有获得它,会发生什么情况?如果 线程中断了,则放弃获取锁的尝试?创建一个至多可有 N 个线程持有的锁?支 持多种方式的锁定(譬如带互斥写的并发读)?或者以一种方式来获取锁,但以 另一种方式释放它?内置的锁定机制不直接支持上述这些情形,但可以在 Java 语言所提供的基本并发原语上构建它们。但是这样做需要一些技巧,而且容易出 错。

服务器应用程序开发人员需要简单的设施来执行互斥、同步事件响应、跨活 动的数据通信以及异步地调度任务。对于这些任务,Java 语言所提供的低级原 语很难用,而且容易出错。 util.concurrent 包的目的在于通过提供一组用于 锁定、阻塞队列和任务调度的类来填补这项空白,从而能够处理一些常见的错误 情况或者限制任务队列和运行中的任务所消耗的资源。

Java理论与实践: 并发在一定程度上使一切变得简单(2)

时间:2010-12-21 IBM Brian Goetz

调度异步任务

util.concurrent 中使用最广泛的类是那些处理异步事件调度的类。在本专 栏七月份的文章中,我们研究了 thread pools and work queues,以及许多 Java 应用程序是如何使用“ Runnable 队列”模式调度小工作单元。

可以通过简单地为某个任务创建一个新线程来派生执行该任务的后端线程, 这种做法很吸引人:

new Thread(new Runnable() { ... } ).start();

虽然这种做法很好,而且很简洁,但有两个重大缺陷。首先,创建新的线程 需要耗费一定资源,因此产生出许许多多线程,每个将执行一个简短的任务,然 后退出,这意味着 JVM 也许要做更多的工作,创建和销毁线程而消耗的资源比 实际做有用工作所消耗的资源要多。即使创建和销毁线程的开销为零,这种执行 模式仍然有第二个更难以解决的缺陷 ― 在执行某类任务时,如何限制所使用的 资源?如果突然到来大量的请求,如何防止同时会产生大量的线程?现实世界中 的服务器应用程序需要比这更小心地管理资源。您需要限制同时执行异步任务的 数目。

线程池解决了以上两个问题 — 线程池具有可以同时提高调度效率和限制资 源使用的好处。虽然人们可以方便地编写工作队列和用池线程执行 Runnable 的 线程池(七月份那篇专栏文章中的示例代码正是用于此目的),但编写有效的任 务调度程序需要做比简单地同步对共享队列的访问更多的工作。现实世界中的任 务调度程序应该可以处理死线程,杀死超量的池线程,使它们不消耗不必要的资 源,根据负载动态地管理池的大小,以及限制排队任务的数目。为了防止服务器 应用程序在过载时由于内存不足错误而造成崩溃,最后一项(即限制排队的任务 数目)是很重要的。

限制任务队列需要做决策 ― 如果工作队列溢出,则如何处理这种溢出?抛 弃最新的任务?抛弃最老的任务?阻塞正在提交的线程直到队列有可用的空间? 在正在提交的线程内执行新的任务?存在着各种切实可行的溢出管理策略,每种 策略都会在某些情形下适合,而在另一些情形下不适合。

Executor

Util.concurrent 定义一个 Executor 接口,以异步地执行 Runnable ,另 外还定义了 Executor 的几个实现,它们具有不同的调度特征。将一个任务排入 executor 的队列非常简单:

Executor executor = new QueuedExecutor(); ... Runnable runnable = ... ; executor.execute(runnable);

最简单的实现 ThreadedExecutor 为每个 Runnable 创建了一个新线程,这 里没有提供资源管理 ― 很象 new Thread(new

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号