【问题标题】:Instance of runnable from a member function来自成员函数的可运行实例
【发布时间】:2020-11-06 02:19:04
【问题描述】:
class test
{
        public static void main(String[] args)
        {
                System.out.println("Start");
                MyClass myClass = new MyClass();
                myClass.runFunc();
                System.out.println("End");
        }
}

class MyClass
{
        public void hello()
        {
                System.out.println("Hello");
        }
        public void runFunc()
        {
                Runnable run = this::hello;
                new Thread(run).start();
        }
}

这里hello 是MyClass 的成员函数,而不是任何实现Runnble 的类的实例。但分配 Runnable run = this::hello; 仍然没有失败,hello 函数正在新线程的上下文中执行。

我知道Runnable 也可以用 lambda 表达式初始化,但这里也不是这样。

我是 Java 新手。有人可以解释一下这是如何工作的以及这种行为背后的逻辑是什么。

【问题讨论】:

    标签: java multithreading runnable


    【解决方案1】:

    这一行:

    Runnable run = this::hello;
    

    是 lambda 简写,实际上是:

    Runnable run = new Runnable() {
        @Override
        public void run() {
            MyClass.this.hello();
        }
    }
    

    您不是在创建一个“属于”您的成员函数的Runnable,而是构造一个新的Runnable,并使用一个调用您的成员函数的run() 方法。

    以下内容在功能上也是等效的:

    Runnable run = () -> this.hello();
    

    【讨论】:

      【解决方案2】:

      这个:

      Runnable r = this::hello;
      

      只是语法糖(不要敲它;大多数语言结构都是):

      Runnable r = () -> this.hello();
      

      这是语法糖*:

      Runnable r = new Runnable() {
          @Override public void run() {
              MyClass.this.hello();
          }
      }
      

      现在应该很明显为什么所有这些都有效,或多或少如何。

      *) 不完全; lambdas 有一些稍微不同的行为,只有当你做“坏”的事情时才会出现(比如试图在这个可运行对象上 synchronize() 或试图获得它的声明类。但只要你不这样做,所有三个 sn -ps 是可以互换的。

      【讨论】:

        猜你喜欢
        • 2015-06-28
        • 1970-01-01
        • 1970-01-01
        • 2018-01-19
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多