Java 8中有一篇相对较新的关于用Actor替代Executor的文章指出,可以使用匿名内部类Runnable
来实现:
// Functional operation
executor.execute(new Runnable() {
System.out.println(data);
});
可以用更加垃圾回收友好的技术来替换,执行相同的操作:
Actor<String> actor = new Actor<>(parentExecutor, ::onMessage);
// Equivalent functional operation
actor.act("Hello world");
public void onMessage(String message) {
System.out.println(message);
}
有道理的是,通常应该使用方法引用而不是匿名内部类(即new Runnable
,new Callable
)。这个想法已经存在一段时间了。使用这种 Actor 模式似乎还有另一个更高效的细节,但文章中并没有明确解释。
我明白使用:
executor.execute(() -> System.out.println(data));
这种方式看起来效率似乎会稍微降低,因为编译器必须在调用时创建一个生成的方法invokedynamic
“调用站点”并引用它。
这里的优势是什么呢?(1)直接方法引用不需要invokedynamic
方法生成的开销,(2)还可以让你将方法参数传递给这个直接引用?这篇文章提出的这个想法,与我们已经使用和了解的模式相比,有哪些关键的要点?
this
引用,即没有任何收益。这就是我说这篇文章是错误的原因,因为使用实例方法引用(在::
之前使用对象),必须为lambda创建一个新对象,这意味着它在GC方面与匿名类对象一样。 - Andreas