【发布时间】:2020-02-01 01:22:25
【问题描述】:
我的 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 方法。
【问题讨论】:
-
它通过类型推断知道它。
new Thread(Runnable)期望...嗯...Runnable,因此 lambda 必须是Runnable的实现。 -
除上述之外。调用
new Thread(new Thread())中的任何一个或传递new Runnable或 lambda,都会将 Thread 构造函数解析为 (runnable),但您不能将 new Thread 作为 lambda 传递,因为它是一个类。 lambda 表达式是只传递函数式接口的简写。 -
除了前面正确的 cmets,我还要补充一点,这称为目标类型,即根据要分配或传递 lambda 的目标来推断类型。
-
除了 all 之前的 cmets,在现代 Java 中很少有充分的理由使用
new Thread;你应该改用Executor。 -
@chrylis-onstrike- 这取决于
run()方法的作用。在这种情况下,您可能是对的,因为run()方法似乎只做一件事然后退出。但对于长时间运行的线程,调用适当的ThreadFactoryobject 可能更有意义。
标签: java lambda java-8 concurrency