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. redis 五种数据结构详解(string,list,set,zset,hash),各种问题综合

    redis 五种数据结构详解(string,list,set,zset,hash) https://www.cnblogs.com/sdgf/p/6244937.html redis 与 spring ...

  2. Ado.Net,关于DataSet和DataTable

    DataSet和DataTable的 区别与联系 1.简要说明二者关系 在我们编写代码的时候从数据库里取出数据,填充到dataset里,再根据表的名字,实例化到 DataTable 中. ●注意如下  ...

  3. 【树莓派】树莓派上刷android系统

    这位前辈之前做了基于android2.3版本刷入树莓派的事情,http://blog.csdn.net/lichwei1983/article/details/44082669 1.android 镜 ...

  4. [memory]虚拟地址空间分布

    一.开篇 踏入嵌入式软件行业也接近2年了,从研一开学起懵懵懂懂的開始学习C语言.因为本科时对这方面了解的少之又少,所以学起来比較困难.可是有一群无私奉献的小伙伴,慢慢的,慢慢的,慢慢的,一仅仅脚踏进了 ...

  5. java第二节 基本数据类型

    class Lesson2 { public static void main(String[] args) { //----------------------------------- //@Da ...

  6. ssh无法登录,提示Pseudo-terminal will not be allocated because stdin is not a terminal.

    当远程通过ssh登录主机时出现Pseudo-terminal will not be allocated because stdin is not a terminal. 错误   字面意思是伪终端将 ...

  7. Javascript判断Crontab表达式是否合法

    这段时间在做Quartz任务调度,使用的Crontab表达式实现的.Crontab由前端页面输入,作为参数穿入后台. 虽然Quartz具有校验Crontab表达式的方法,如下: boolean cro ...

  8. Easyui入门视频教程 第11集---Window的使用

    目录 Easyui入门视频教程 第11集---Window的使用   Easyui入门视频教程 第10集---Messager的使用  Easyui入门视频教程 第09集---登录完善 图标自定义   ...

  9. 如何在 CentOS 7 中安装或升级最新的内核

    虽然有些人使用 Linux 来表示整个操作系统,但要注意的是,严格地来说,Linux 只是个内核.另一方面,发行版是一个完整功能的系统,它建立在内核之上,具有各种各样的应用程序工具和库. 在正常操作期 ...

  10. ios中tableview侧栏的折叠

    #import "ViewController.h" #define Ksmall 40.0f #define Klarge 80.0f #define KNoOpen @&quo ...