我用两种方法创建runner。但是:新的不起作用。然后我在runner1的构造上标记了调试器点。调试器点也不起作用。谁能告诉我为什么?
runner1::new中的runnable与runnable有什么区别吗?
这是我的密码。
public static void main(String[] args) {
Runnable n1 = Runner1::new;
Runnable n2 = new Runner2();
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(n1);
executorService.submit(n2);
while (true) {
}
}
public static class Runner1 implements Runnable {
public Runner1() {
System.out.println("construct 1");
}
@Override
public void run() {
System.out.println("hello1");
}
}
public static class Runner2 implements Runnable {
public Runner2() {
System.out.println("construct 2");
}
@Override
public void run() {
System.out.println("hello2");
}
}
1条答案
按热度按时间8ehkhllq1#
Runnable n1 = Runner1::new
与此代码大致类似:换句话说
Runnable
n1
将示例化Runner1
当它被召唤的时候。这不是您想要做的,而是您想要示例化
Runner1
并分配新的Runner1
到n1
,就像你对我一样n2
.使用
::new
语法作为Runnable
不是很有用,因为Runnable
没有返回值。换句话说:你的n1
Runnable
将示例化一个Runner1
但不允许任何其他代码访问它。路途
::new
通常用于实现类似于Supplier
这样地: