2016-02-19 80 views
0

在执行Java到Groovy代码迁移的初始阶段时,我遇到了一个问题,即当Java返回正确的整数(123)时,Groovy版本从Future返回null。未来从执行器服务提交返回null提交

在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(); 
    } 
} 

//文件: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(); 
    } 
} 

Java结果:123

Groovy的结果:空

这是实验如果是的话,为什么?我尝试了许多变体,都产生相同的结果。有什么我缺少使用Groovy产生相同的结果?

Groovy: 2.4.5 
Java: 1.8 64-bit 
Platform: Windows 7 64-bit 

回答

6

在Groovy中,一个闭合件为RunnableCallable

不幸的是,当您拨打executor.submit { .. }时,运行系统选择调用executor.submit(Runnable),该值不返回值。

你应该明确地投你封的可赎回:

def executor = Executors.newFixedThreadPool(1) 
def future = executor.submit ({ -> 123 } as Callable) 
println "Result: ${future.get()}" 
executor.shutdown()