在执行Java到Groovy代码迁移的初始阶段时,我遇到了一个问题,即Groovy版本从Future返回null,而Java返回正确的整数(123).
J1.java和G1.groovy之间唯一的变化是类名和lambda到闭包转换.
//文件:J1.java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class J1 {
public static void main (String... args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool (1);
Future<Integer> future = executor.submit (() -> 123);
System.out.println ("Result: " + future.get ());
executor.shutdown ();
}
}
Run Code Online (Sandbox Code Playgroud)
//文件:G1.groovy
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class G1 {
public static void main (String... args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool (1);
Future<Integer> future = executor.submit ({ -> 123 });
System.out.println ("Result: " + future.get ());
executor.shutdown ();
}
}
Run Code Online (Sandbox Code Playgroud)
Java结果:123
Groovy结果:null
这是预期的,如果是这样,为什么?我尝试了很多变化,都产生了相同的结果.是否有一些我缺少使用Groovy产生相同结果的东西?
Groovy: 2.4.5
Java: 1.8 64-bit
Platform: Windows 7 64-bit
Run Code Online (Sandbox Code Playgroud)
在Groovy中,闭包是a Runnable
和a Callable
.
不幸的是,当你调用时executor.submit { .. }
,运行时选择调用executor.submit(Runnable)
哪个不返回值.
你应该明确地将你的闭包转换为Callable:
def executor = Executors.newFixedThreadPool(1)
def future = executor.submit ({ -> 123 } as Callable)
println "Result: ${future.get()}"
executor.shutdown()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1699 次 |
最近记录: |