Java 8 CustomizedThread::new 等于新的 CustomizedThread()?
Java 8 CustomizedThread::new equals new CustomizedThread()?
我通过两种方式创建 Runner。但是 ::new 不起作用。
然后我在 Runner1 的构造上标记了调试器点。调试器点也不起作用。
谁能告诉我为什么?
和Runner1::new中的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");
}
}
Runnable n1 = Runner1::new
大致类似于这段代码:
Runnable n1 = () -> new Runner1();
换句话说,Runnable
n1
将实例化一个Runner1
当它被调用时.
这不是你想要做的,而是你想 实例化一个 Runner1
并将新的 Runner1
分配给 n1
,就像您对 n2
.
所做的一样
将 ::new
语法用作 Runnable
不是很有用,因为 Runnable
没有 return 值。换句话说:您的 n1
Runnable
会 实例化 一个 Runner1
但不会使其可供任何其他代码访问。
通常使用::new
的方式是像这样实现类似Supplier
的东西:
Supplier<List<Object>> emptyListSuppier = ArrayList::new;
我通过两种方式创建 Runner。但是 ::new 不起作用。 然后我在 Runner1 的构造上标记了调试器点。调试器点也不起作用。 谁能告诉我为什么?
和Runner1::new中的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");
}
}
Runnable n1 = Runner1::new
大致类似于这段代码:
Runnable n1 = () -> new Runner1();
换句话说,Runnable
n1
将实例化一个Runner1
当它被调用时.
这不是你想要做的,而是你想 实例化一个 Runner1
并将新的 Runner1
分配给 n1
,就像您对 n2
.
将 ::new
语法用作 Runnable
不是很有用,因为 Runnable
没有 return 值。换句话说:您的 n1
Runnable
会 实例化 一个 Runner1
但不会使其可供任何其他代码访问。
通常使用::new
的方式是像这样实现类似Supplier
的东西:
Supplier<List<Object>> emptyListSuppier = ArrayList::new;