我正在学习 Java 线程,并且遇到了两种不同的创建线程的方法。我不确定它们之间的技术差异:
// Approach 1
Thread n = new Thread(new NumberGenerator(100));
// Approach 2
Thread n = new Thread(new NumberGenerator(100)::run);
这是我完整的上下文示例代码:
public class NumberGenerator implements Runnable {
private int limit;
public NumberGenerator(int limit) {
this.limit = limit;
}
@Override
public void run() {
for(int i = 0; i < limit; i++) {
System.out.println(i);
}
}
}
public class Main {
public static void main(String[] args) {
// Which approach is better and why?
Thread t1 = new Thread(new NumberGenerator(100));
Thread t2 = new Thread(new NumberGenerator(100)::run);
t1.start();
t2.start();
}
}
我已经测试了这两种方法,它们的工作原理似乎相似,但我想了解潜在的差异和最佳实践。
据我所知,两种方法都在 Thread.java
上使用此构造函数 public Thread(Runnable target) {
this(null, target, "Thread-" + nextThreadNum(), 0);
}
那么,它们可以被认为是 Runnable 的子类吗?在这种情况下,确定对象是否为 Runnable 的条件是什么?这两种方法之间有什么技术差异?
这段代码
Thread n = new Thread(new NumberGenerator(100)::run);
是以下代码的简写
Thread n = new Thread(new Runnable() {
public void run() {
new NumberGenerator(100).run();
}
});
您正在创建两个
Runnable
对象,这是多余的。
这样做更容易
Thread n = new Thread(new NumberGenerator(100));