考虑代码:
示例 1
var Executors = java.util.concurrent.Executors;
var executor = Executors.newCachedThreadPool();
var fork = function (callable) {
// Clarify Runnable versus Callable overloaded methods
executor['submit(java.util.concurrent.Callable)'](callable);
};
fork(function(){ ... }); //ok
这行得通。
但这不起作用:
示例 2
var Executors = java.util.concurrent.Executors;
var executor = Executors.newCachedThreadPool();
var fork = executor['submit(java.util.concurrent.Callable)'];
fork(function(){ ... }); //fails, NullPointerException
我假设,这是因为fork
这里不是一个 JS Function 实例,它实际上是一个实例jdk.internal.dynalink.beans.SimpleDynamicMethod
我尝试使用fork.apply(executor,function() { ... });
,但很自然,SimpleDynamicMethod 没有apply
.
实际上,为什么示例 2 不起作用,而示例 1 起作用?
这仅仅是 Nashorn 的一项福利吗?是否有比示例 1 更好的方法来定义 fork() 函数?
更新
在示例 2 中,
print(typeof fork);
报告function
print(fork)
报告[jdk.internal.dynalink.beans.SimpleDynamicMethod Future java.util.concurrent.AbstractExecutorService.submit(Callable)]
例外是(第 13 行阅读fork(function() {
)
Exception in thread "main" java.lang.NullPointerException
at jdk.nashorn.internal.scripts.Script$\^eval\_._L5(<eval>:13)
at jdk.nashorn.internal.scripts.Script$\^eval\_.runScript(<eval>:5)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:527)