10. Groovy GPars

GPars 一开始在 Groovy 中作为一个单独的项目,同时带来了很多并发的机制。它包含了很多并行的map/redueActors,以及其他很多并发的模块。

1. Parallel Map-Reduce

在下面的例子中,我们定义了一个包含毕业年份和平均分数的Student类。

class Student {
int graduationYear;
double gpa;
}

同时定义个包含Student的 List,这时你就可以使用 GPars 类库对 List 执行并行的 map-reduce 操作。

GParsPool.withPool {
// a map-reduce functional style (students is a Collection)
def bestGpa = students.parallel
.filter{ s -> s.graduationYear == Student.THIS_YEAR }
.map{ s -> s.gpa }
.max()
}

静态方法GParsPool.withPool 接收一个闭包以及增加集合的方法(使用 Groovy 的 Category 机制)。parallel 实际上从给定的集合中创建了一个ParallelArray对象,在使用时包装了一个包装类。

Tip

详情请参考Map-Reduce

2. Actor

Actor 设计模式在开发并发软件时非常有用。在此模式中,每一个 Actor 执行自己的线程和操作只属于自己的数据。这些数据不能被其他的线程所操作。消息在 Actor 中被传递,从而改变数据。你也可以创建无状态的 Actor。

当在某一时间数据只能被一个线程所改变时,我们就称之为是线程安全的。

import groovyx.gpars.actor.Actor
import groovyx.gpars.actor.DefaultActor class Dragon extends DefaultActor {
int age
void afterStart() {
age = new Random().nextInt(1000) + 1
}
void act() {
loop {
react { int num ->
if (num > age)
reply 'too old'
else if (num < age)
reply 'too young'
else {
reply 'you guessed right!'
terminate()
}
}
}
}
}
// Guesses the age of the Dragon
class Guesser extends DefaultActor {
String name
Actor server
int myNum
void act() {
loop {
myNum = new Random().nextInt(1000) + 1
server.send myNum
react {
switch (it) {
case 'too old': println "$name: $myNum was too old"; break
case 'too young': println "$name: $myNum was too young"; break
default: println "$name: I won $myNum"; terminate(); break
}
}
}
}
} def master = new Dragon().start()
def player = new Guesser(name: 'Guesser', server: master).start() //this forces main thread to live until both actors stop
[master, player]*.join()

在这里,Dragon类一开始随机生成在1到1000的年龄的整数。它对一个给定的数字作出反应,如果数字太大,太小,或相同的年龄。Guesser类不停循环,产生一个随机数并发送到Dragon类(也就是Server)。Guesser类从Dragon类得到反馈程序终止时,则猜出正确的年龄了。

Groovy 学习手册(7)的更多相关文章

  1. Groovy 学习手册(6)

    9. 不可变特性 不可变特性和函数式编程在一起就像是花生酱和果酱在一起一样.虽然没有必要非要在一起使用,但他们相处得很好. 在纯正的函数式语言中,每个函数对本身之外没有影响,即没有副作用.这意味着每次 ...

  2. Groovy 学习手册(5)

    8. 函数式编程 函数式编程(FP)是一种编程风格,侧重于函数和最小化状态的变化(使用不可变的数据结构).它更接近于用数学来表达解决方案,而不是循序渐进的操作. 在函数式编程里,其功能应该是" ...

  3. Groovy 学习手册(4)

    6. 领域特定语言 Groovy 有许多特性,使它非常适合写DSL(领域特定语言).这些特性包活: 具有委托机制的闭包: 点号(.)和语句末尾的分号(;)是可选的: 运算符的重载(例如,加号,减号等) ...

  4. Groovy 学习手册(3)

    五. Groovy 的设计模式 设计模式是一种非常好的方式,可以使你的代码变得实用,可读又具有扩展性.跟 Java 相比,在 Groovy 里使用设计模式使代码更加简洁和容易. 1. 策略模式 设想一 ...

  5. Groovy 学习手册(2)

    二. 工具 1. 控制台 groovyConsole: Groovy 控制台是一个非常易于使用和简单的轻量级的编辑器.你可以在里面做很多事情. 在编辑器里面可以书写代码,Windows 下,按下Ctr ...

  6. Groovy 学习手册(1)

    1. 需要安装的软件 Java / Groovy 对应 Java 和 Groovy,你需要安装以下软件: Java JDK,例如 JDK 8 IDE,例如 Eclipse,NetBeans 8 Gro ...

  7. Kotlin强化实战!这份学习手册让你的面试稳如泰山

    一.引言 正如官网的slogan所描述:kotlin,是一门让程序员写代码时更有幸福的现代语言. 同时,也正如维基百科里介绍: JetBrains公司希望Kotlin能够推动IntelliJ IDEA ...

  8. Redis学习手册(目录)

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  9. git学习手册

    #git学习手册 git: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 Linux内核开发而 ...

随机推荐

  1. mycat分库分表 mod-long

    转载自:http://blog.csdn.net/sunlihuo/article/details/54574903 下面是配置文件 schema.xml: <?xml version=&quo ...

  2. C#中将DLL文件打包到EXE文件

    1:在工程目录增加dll目录,然后将dll文件复制到此目录,例如: 2:增加引用,定位到工程的dll目录,选中要增加的dll文件 3:修改dll文件夹下面的dll文件属性 选中嵌入式资源,不复制. 4 ...

  3. WINDOWS7 下 xclient 802.1x 客户端 停止运行的解决办法

    昨天下午,由于FOXMAIL 出现问题,修改了一个地方,导致xclient 停止运行.具体解决办法如下:右击“计算机”-进入“系统属性”-->“高级”-->"设置"-- ...

  4. 取自ACE中的bit操作宏(转)

    # define ACE_BIT_ENABLED(WORD, BIT) (((WORD) & (BIT)) != ) # define ACE_BIT_DISABLED(WORD, BIT) ...

  5. 〖Linux〗简单的将Shell和一些文件打包成一个单独的“可执行文件”

    有时候给别人分享一个工具的时候,同时需要提供的文件比较多: 如果分享一个压缩包还得教会对方如何解压.执行哪个脚本,感觉需要传输的内容多了就不方便: 把几个Shell脚本和文件打包成一个“单独的可执行文 ...

  6. 【PMP】三点估算法

    通过考虑估算中的不确定性和风险,可以提高持续时间估算的准确性. 最可能时间(tM):基于最可能获得的资源.最可能取得的资源生产率.对资源可用时间的现实预计,资源对其他参与者的可能依赖关系及可能发生的各 ...

  7. Axure 万年历(日期选择下拉文本框)

    百度网盘:http://pan.baidu.com/s/1c1ZjUPq 点击“图1”可呈现出“图2”的效果.(已实现模板化功能,不用去研究去为什么,直接使用即可)

  8. UVA - 10298 Power Strings (KMP求字符串循环节)

    Description Problem D: Power Strings Given two strings a and b we define a*b to be their concatenati ...

  9. windows 10 WMI Provider Host 占用CPU过高的问题

    有些时候win 10开机上几天,就会变成这样,老是找不到根源,所以暂时用重启服务的办法解决了. 重启下windows management instrumentation就可以了.

  10. [转载]CentOS6&nbsp;快速搭建轻量级远程桌面&nbsp;Xfce&nb

    原文地址:CentOS6 快速搭建轻量级远程桌面 Xfce & VNC & Firefox作者:哈囉健一 0.系统信息 CentOS Linux release 6.0 (Final) ...