首页 / 软件开发 / JAVA / 使用GPars解决常见并发问题
使用GPars解决常见并发问题2012-03-17 IBM Alex Miller了解 Groovy 的并发库如何利用流行的并发模型并使其在 Java 平台上可供访问在并发性时代,带有 4、6 和 16 个处理器核心的芯片变得很普遍,而且在不久的将来,我们会看到带有上百甚至上千个核心的芯片。这种处理能力蕴含着巨大的可能性,但对于软件开发人员来说,它也带来了挑战。最大限度地利用这些闪耀新核的需求推动了对并发性、状态管理和为两者构建的编程语言的关注热潮。Groovy、Scala 和 Clojure 等 JVM 语言满足了这些需求。这三种都是较新的语言,运行于高度优化的 JVM 之上,可以使用 Java 1.5 中新增的强大的 Java 并发库。尽管每种语言基于其原理采用不同的方法,不过它们都积极支持并发编程。在本文中,我们将使用 GPars,一种基于 Groovy 的并发库,来检查模型以便解决并发性问题,比如后台处理、并行处理、状态管理和线程协调。为何选择 Groovy ?为何选择 GPars ?Groovy 是运行于 JVM 之上的一种动态语言。基于 Java 语言,Groovy 移除了 Java 代码中的大量正式语法,并添加了来自其他编程语言的有用特性。Groovy 的强大特性之一是它允许编程人员轻松创建基于 Groovy 的 DSL。GPars 或 Groovy Parallel Systems 是一种 Groovy 并发库,捕捉并发性和协调模型作为 DSL。GPars 的构思源自其他语言的一些最受欢迎的并发性和协调模型,包括:来自 Java 语言的 executors 和 fork/join来自 Erlang 和 Scala 的 actors来自 Clojure 的 agents来自 Oz 的数据流变量Groovy 和 GPars 的结合成为展示各种并发性方法的理想之选。甚至不熟悉 Groovy 的 Java 开发人员也能轻松关注相关讨论,因为 Groovy 的语法以 Java 语言为基础。本文中的示例基于 Groovy 1.7 和 GPars 0.10。后台和并行处理一个常见的性能难题是需要等待 I/O。I/O 可能涉及到从一个磁盘、一个 web 服务或甚至是一名用户读取数据。当一个线程在等待 I/O 的过程中被阻止时,将等待中的线程与原始执行线程分离开来将会很有用,这将使它能继续工作。由于这种等待是在后台发生的,所以我们称这种技术为 后台处理。例如,假设我们需要这样一个程序,即调用 Twitter API 来找到针对若干 JVM 语言的最新 tweets 并将它们打印出来。Groovy 能够使用 Java 库 twitter4j 很容易就编写出这样的程序,如清单 1 所示:清单 1. 串行读取 tweets (langTweets.groovy)import twitter4j.Twitter
import twitter4j.Query
@Grab(group="net.homeip.yusuke", module="twitter4j", version="2.0.10")
def recentTweets(api, queryStr) {
query = new Query(queryStr)
query.rpp = 5 // tweets to return
query.lang = "en" // language
tweets = api.search(query).tweets
threadName = Thread.currentThread().name
tweets.collect {
"[${threadName}-${queryStr}] @${it.fromUser}: ${it.text}"
}
}
def api = new Twitter()
["#erlang","#scala","#clojure"].each {
tweets = recentTweets(api, it)
tweets.each {
println "${it}"
}
}