Java 的一个很值得称道的特性是在语言级支持多线程。定义了 Runnable 接口,并在根类 Object 中提供了 wait/notify 方法,还有 synchronized 关键字的支持。我们常说实现多线程的方式有两种:继承 Thread 和实现 Runnable,实质上工作者线程执行的都是 Runnable 接口中定义的 run() 方法,Thread 本身实现了 Runnable 接口,它不过是为线程的调度使用提供了许多有用的方法。
而 Groovy 作为 Java 家族的皇储(安心做储君就行了),多线程方面自然不会甘拜下风。Groovy 通过 MetaClass 对 java.lang.Thread 进行了扩展,即所谓的 GDK - Groovy methods added to Java SE classes。
在原 java.lang.Thread 类中增加了两个方法,分别是:
static Thread start(Closure closure);
static Thread startDaemon(Closure closure); //对应的是 Daemon 线程
这两个方法接受的参数是闭包,要知道所有的闭包都是继承自 groovy.lang.Closure,而它是实现了 java.lang.Thread 的。所以使用闭包很容易实现 Groovy 中的多线程。具体到代码上就有以下几种写法:
view sourceprint?1.t = new Thread() {/* Closure body */};
2.t.start();
3.
4.Thread.start { /* Closure body */};
5.
6.Thread.startDaemon { /* Closure body */};
这样,闭包中的代码就会在一个新的线程中执行。真的是这样吗?最能加深印象的做法是我们用一段代码来测试一下,可以从两方面来观察,满足一项即可:
1. 闭包外部和内总分别打印出当前的线程名看是否不一样,是则为不同线程
2. 看闭包中的操作是否要阻塞主线程,不会则表示在新线程中执行的闭包
view sourceprint?1.println "Outter thread: "+Thread.currentThread().getName();
2.Thread.start {
3.
println "Inner thread: "+Thread.currentThread().getName();
4.
"How are you?".each {
5.
print it;
6.
}
7.}
8.println "Fine, thank you.";
我执行后的输出都是:
Outter thread: main
Fine, thank you.
Inner thread: Thread-1
How are you?
线程名不一样,并且最后一行代码有机会在闭包执行之前或之中执行,从这两者中任一条件说明了闭包是在新线程中执行的。试着以通常的方式调用闭包,就是不一样的情况了。
Java 中可以使用 Timer 和 TimerTask 来实现定时任务--在新线程中执行。Groovy 对此 java.util.Timer 也有相应的扩展,增加了 runafter(int delay,Closure closure) 方法。因此在 Groovy 中应用 Timer 也能实现多线程:
view sourceprint?1.new Timer().runAfter(1000) { /* Closure body */}
其他与线程相关 wait/notify 和 synchronized 控制,在使用上与 Java 差不多的。
知其然,然后总希望知其所以然,否则不免觉得有物梗梗于心头似的。至少能大概了解一下 Groovy 对于多线程的实现原理。
Thread.start() 和 Thread.startDaemon() 最终实际调用的是 org.codehaus.groovy.runtime.DefaultGroovyStaticMethods 的相应两个方法:
public static Thread start(Thread self, Closure closure);
public static Thread startDaemon(Thread self, Closure closure)
在 IDE 中,引入 Groovy 的源代码,在这两个方法上打上两个断点就能发现 Thread.start() 大约是循着,以下路径到来的:
ScriptBytecodeAdapter.invokeMethodN()->InvokerHelper.invokeMethod()->MetaClassImpl.invodeStaticMethod()->...->NewStaticMetaMethod.invoke()->...->DelegatingMethodAccessorImpl.invoke()->..->NativeMethodAccessorImpl.invoke0()->DefaultGroovyStaticMethods.start();
而 Timer.runAfter() 方法最终调用的是 org.codehaus.groovy.runtime.DefaultGroovyMethods 的
public staic TimerTask runAfter(Timer timer, Closure closure) 方法。
这些新方法是在 Groovy 运行时通过 MetaClass 新引入到原有 Java 类中的,或是对已引入过的方法会从 CacheMethod 中取用。
由此及彼,通过对上面过程的了解,我们发现了有几个 Groovy 类很值得去关注的,那就是:
org.codehaus.groovy.runtime.DefaultGroovyMethods
org.codehaus.groovy.runtime.DefaultGroovyStaticMethods
org.codehaus.groovy.runtime.DefaultGroovyMethodsSupport
留意这三个类(尤其是第一个类)中的方法,你会发现所有的 Groovy 对 Java 类的扩展都能在其中找到。或许能称之为 GDK 扩展。瞧瞧 DefaultGroovyMethod 的个头,一万多行代码,再看看 Groovy 对 DefaultGroovyMethod 的类说明:
This class defines all the new groovy methods which appear on normal JDK classes inside the Groovy environment. Static methods are used with the first parameter the destination class.
这让您觉得像 Groovy 中类似 each()、splitEachLine()、any() 这样的方法大可不必如先前那般惊讶了。
参考:1. 《Groovy in Action》 (2007.1) 9.3 Working with threads and processes
分享到:
相关推荐
1. **Groovy基础**:介绍Groovy的基本语法,包括变量声明、控制结构(如if-else、for循环、switch语句)、函数定义和调用等。Groovy的动态类型系统也是讲解的重点,它允许在运行时动态地改变类型,简化了代码编写。 ...
- Groovy 2 引入了新的并发原语,如 `@Grabbed` 注解,用于处理多线程环境下的资源锁定问题。 - 支持使用 `grizzly` 和 `Akka` 库来实现更高效的并发编程模型。 4. **增强的语法糖**: - 提供了更多的语法糖,如...
此外,Groovy还提供了许多库,如GPars(Groovy Parallel Systems),用于并发和多线程编程,这在处理复杂的文本界面程序时可能会派上用场。 在"完成文本界面的程序框架"这部分,你可能已经学习了如何组织代码,使其...
此外,《Groovy in Action》也涵盖了Groovy对多线程和并发的支持,以及如何利用Groovy的天鹅绒测试(Geb)库进行Web自动化测试。书中还包含了一些实战项目,让读者能够亲手实践,加深对Groovy的理解。 总之,...
10. **并发编程**:Groovy如何支持线程和并发,包括使用闭包进行并发操作。 11. **AST转换**:Groovy的抽象语法树(AST)转换允许开发者在编译时改变程序结构,实现自定义行为。 12. **GroovyShell和...
2. **Java从入门到精通 第41版.pdf**:这本书可能详细讲解了Java语言的基础和高级特性,包括集合框架、多线程、网络编程、IO流等,对于Java初学者或进阶者都非常有帮助。 3. **GROOVY入门经典.pdf**:这本书可能会...
与Node.js相比,Vert.x更加灵活,因为它支持多种编程语言如JavaScript、Ruby、Groovy、Java等,甚至可以在同一项目中混合使用这些语言。 #### 二、Vert.x的核心概念 为了更好地理解Vert.x的线程模型,我们首先需要...
为了方便开发者快速构建应用,HarmonyOS提供了丰富的组件库,包括UI组件、动画图形组件、框架组件、安全组件、工具组件、网络组件、文件数据组件、多媒体组件、图片缓存组件以及基础功能组件等。 这些组件的特点...
首先,我们需要理解Groovy的基础语法。Groovy的语法简洁且富有表达力,它支持面向对象编程、函数式编程和动态类型。在处理查询担保订单的分片问题时,Groovy可以用来编写灵活的查询逻辑,比如使用闭包来实现复杂的...
6. **JSR223脚本**:JMeter还支持JSR223接口,这意味着你可以使用任何支持该接口的脚本语言(如Groovy、JavaScript等)来增强测试逻辑,提高效率。 三、Java经验技巧 7. **性能测试设计**:在使用JMeter时,合理...
《Thinking in Java Fourth Edition》是Java学习者的必读经典,书中详尽地讲解了Java的基础概念、数据结构、面向对象编程、网络编程、多线程以及异常处理等多个方面。第四版更新了Java SE 5.0和6.0的新特性,如泛型...
在Java编程语言中,`List`、`Map`是两种非常重要的数据结构,它们在处理序列数据和键值对数据时发挥着关键作用。这里我们将深入探讨`ArrayList`...熟练掌握这些基础数据结构和遍历方法是成为一名优秀Java程序员的基础。
- **Gradle**:采用Groovy语言编写脚本,提供了更灵活的构建方式。 综上所述,“Java 16年基础班+就业班教学视频”覆盖了从Java语言基础到高级特性、从理论知识到实际项目开发的全过程,旨在帮助学员全面掌握Java...
Griffon对多线程的支持包括线程安全的组件和事件处理机制,这为创建响应式和高效的桌面应用提供了坚实基础。 此外,Griffon还强调了测试的重要性。Griffon支持单元测试和集成测试,并且提供了一整套工具来帮助...
它的易学性和跨平台特性使其在众多编程语言中脱颖而出,而基于Java的JVM则允许运行多种语言,如Python、Scala、Groovy和Clojure,极大地扩展了Java的应用范围。 随着大数据时代的到来,人们对于数据处理的需求从...
Groovy Android华硕Zenfone 2 ... XDA的线程将继续作为用户,开发人员和编译器之间所有交互的基础。 但是,有时可能很难找到某些信息。 届时,该站点将尝试总结哪些可能被视为更重要或更重复的问题。 享受!!
书中不仅涵盖了Java,还涉及Scala、Clojure、Kotlin和Groovy这四种其他JVM语言,展现了JVM的广泛适应性。 在内容提要中,第一章首先概述了Java平台和JVM的重要性,特别是它们在现代计算中的应用,如Web应用程序、大...