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
}