gpt4 book ai didi

java - 使用 Thread 和 Runnable 时,Lamba 在 Java 中如何工作?

转载 作者:行者123 更新时间:2023-12-02 09:03:17 26 4
gpt4 key购买 nike

我的 IDE(IntelliJ) 建议替换此代码:

private void countIterations() {
new Thread(new Runnable() {
@Override
public void run() {
long startTimestamp = System.currentTimeMillis();
long endTimestamp = startTimestamp + ITERATIONS_COUNTER_DURATION_SEC * 1000;

int iterationsCount = 0;
while (System.currentTimeMillis() <= endTimestamp) {
iterationsCount++;
}

Log.d(
"Exercise1",
"iterations in " + ITERATIONS_COUNTER_DURATION_SEC + "seconds: " + iterationsCount
);
}
}).start();

}

这样:

private void countIterations() {
new Thread(() -> {
long startTimestamp = System.currentTimeMillis();
long endTimestamp = startTimestamp + ITERATIONS_COUNTER_DURATION_SEC * 1000;

int iterationsCount = 0;
while (System.currentTimeMillis() <= endTimestamp) {
iterationsCount++;
}

Log.d(
"Exercise1",
"iterations in " + ITERATIONS_COUNTER_DURATION_SEC + "seconds: " + iterationsCount
);
}).start();

}

我的问题是它如何知道它是一个 Runnable? Thread 和 Runnable 都有 run 方法。

最佳答案

how does it know that it's a Runnable?

首先,让我们确保我们知道“Runnable”的含义。经验丰富的 Java 程序员说,没有考虑得太深,但 Runnable 不是一个类。它是一个接口(interface):它是某个实际类预期具有的一个或多个方法的规范。当我们说“Runnable”时,我们真正的意思是“实现 Runnable 的某个类的实例。”

那么编译器如何知道 lambda 表达式必须创建“可运行的对象”?这很容易。编译器已经看到了 Thread 类的声明,并且 Thread 类声明明确指出构造函数的参数必须是 Runnable。

Both Thread and Runnable have the run() method.

好的。 Thread 实现了 Runnable,但在那里使用 Thread 实例没有任何意义,因为 Threadrun() 方法不会执行您希望线程执行的操作。编译器必须使用run()方法定义一个全新的类,该方法执行您放入 lambda 正文中的所有操作。系统中没有其他类可以完成所有这些事情。

好的,那么为什么新类没有扩展Thread呢? (或者,扩展任何其他实现 Runnable 的现有类?)

只是因为没有理由这样做。 Thread 构造函数并没有说它需要一个 Thread 参数。它说它需要一个 Runnable 参数。它会对实现 Runnable任何类感到满意,并且除了调用其 run() 方法之外,它不会对该对象执行任何操作。

好的,但是编译器如何知道将 lambda 主体放入名为 run() 的方法中?

因为Runnable是一个@function接口(interface),它只声明一个方法。 Runnable 对象必须有一个 run() 方法,并且接口(interface)没有指定任何其他方法,因此没有任何其他选择.

关于java - 使用 Thread 和 Runnable 时,Lamba 在 Java 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60013229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com