2016-02-19 79 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()