Java,为什么ExecutorService::executor()可以执行没有实现Runnable接口的函数?

Java, Why can ExecutorService::executor() execute funciton that do not implement Runnable interface?

这更像是一个理论问题。我最近在 java 中创建了一个简单的多线程应用程序,我使用 ExecutorService 来 运行 和管理线程。我启动线程的方式非常简单,我在 class 中创建一个函数,然后将此函数作为参数发送给 ExecutorService::execute() 函数,如下所示:

public void foo(){ 
   //method code here
}

myExecutor.execute(this::foo);

但是正如您所注意到的,我没有在任何地方实现 Runnable 接口,而且我没有 运行() 方法,但是这个方法有效。根据我的阅读,传递给 execute 函数的对象应该是一个带有 运行() 方法 (see execute documentation) 的 Runnable。有人可以解释为什么我的方法有效吗?当我的方法有效时是否真的需要一个 "Runnable" 对象?

这是因为 :: 运算符(方法引用运算符)是 lambda 函数的 shorthand,它是一个 Runnable,可以这样写:

myExecutor.execute(() -> foo());