Java Runnable接口和Lambda,这是正确的方法之一吗?

Java Runnable接口和Lambda,这是正确的方法之一吗?,java,lambda,Java,Lambda,如果我将其更改为Runnable task3=()->new RunnerL().run()或Runnable task3=new RunnerL(),它会工作,为什么?因为下面的代码只创建RunnerL实例,但Runnable的run()方法并没有真正运行它(不执行run方法)。线程在Runnable实例上调用run()(因此只调用lambda): 下面创建RunnerL实例,当线程启动时,它直接在该实例上调用run()方法: Runnable task3 = () -> new Ru

如果我将其更改为
Runnable task3=()->new RunnerL().run()
Runnable task3=new RunnerL()
,它会工作,为什么?

因为下面的代码只创建
RunnerL
实例,但
Runnable
run()
方法并没有真正运行它(不执行run方法)。线程在
Runnable
实例上调用
run()
(因此只调用lambda):

下面创建
RunnerL
实例,当线程启动时,它直接在该实例上调用
run()
方法:

 Runnable task3 = () -> new RunnerL ();

上述方法实际上是最好的选择,另一种方法不必要地将
Runnable
包装到另一个
Runnable

要使用Runnable接口创建和启动线程,必须执行以下操作:

1) 创建一个实现Runnable的类

 Runnable task = new RunnerL();
2) 在Runnable类中提供一个run方法

class RunnerL implements Runnable {}
3) 创建Thread类的实例,并将可运行对象作为参数传递给其构造函数

创建了一个线程对象,可以运行您的可运行类。

 public void run() {
        // TODO Auto-generated method stub

        }
RunnableClass rc = new RunnableClass();
Thread t = new Thread(rc);
4) 调用线程对象的start方法

您的Runnable对象的run方法在单独的线程中被调用和执行。

 public void run() {
        // TODO Auto-generated method stub

        }
RunnableClass rc = new RunnableClass();
Thread t = new Thread(rc);
Runnable task3=()->new RunnerL()


在Java8中,实际上不需要在类中实现
Runnable
。如果该方法具有正确的签名,Java将接受该方法作为可运行的。例如:

**This is not running your runnable class.Just creating an instance.**

这就是Java 8中函数接口的要点:您基本上不需要显式实现它们,因为匹配接口唯一非默认方法签名的lambda表达式(包括方法引用)可以充当接口的实现。

lambda表达式提供了实现(定义)函数接口内的方法(仅包含单个抽象方法)。因此,在这里,您需要了解您实际上是在为
Runnable
接口的抽象
run()
方法提供实现

为了更好地理解这个概念,只需将构造函数添加到
RunnerL
类中,如下所示,这样您就可以注意到实际发生的情况:

class CountToTen {
    public void count() {
        IntStream.rangeClosed(1, 10).forEach(System.out::println);
    }
}

CountToTen counter = new CountToTen();
Thread thread1 = new Thread (counter::count);
thread1.start();
为什么跟随不起作用? Runnable task3=()->new RunnerL(); 新线程(task3.start()

这个Lambda表达式(即
Runnable
接口的
run()
方法的实现)只是为
RunnerL
创建对象并调用上述构造函数(即,打印语句“constructor called”)

如果我将其更改为Runnable task3=()->new RunnerL().run(),它会工作,为什么

这个Lambda表达式创建对象,通过打印“constructor called”调用构造函数,然后调用
run()
方法

class CountToTen {
    public void count() {
        IntStream.rangeClosed(1, 10).forEach(System.out::println);
    }
}

CountToTen counter = new CountToTen();
Thread thread1 = new Thread (counter::count);
thread1.start();
class RunnerL implements Runnable {

    public RunnerL() {
        System.out.println(" constructor called ");
    }

    //Add your run() method here
}