Java8CustomizedThread::new等于new customizedthread()?

o8x7eapl  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(373)

我用两种方法创建runner。但是:新的不起作用。然后我在runner1的构造上标记了调试器点。调试器点也不起作用。谁能告诉我为什么?
runner1::new中的runnable与runnable有什么区别吗?
这是我的密码。

  1. public static void main(String[] args) {
  2. Runnable n1 = Runner1::new;
  3. Runnable n2 = new Runner2();
  4. ExecutorService executorService = Executors.newFixedThreadPool(2);
  5. executorService.submit(n1);
  6. executorService.submit(n2);
  7. while (true) {
  8. }
  9. }
  10. public static class Runner1 implements Runnable {
  11. public Runner1() {
  12. System.out.println("construct 1");
  13. }
  14. @Override
  15. public void run() {
  16. System.out.println("hello1");
  17. }
  18. }
  19. public static class Runner2 implements Runnable {
  20. public Runner2() {
  21. System.out.println("construct 2");
  22. }
  23. @Override
  24. public void run() {
  25. System.out.println("hello2");
  26. }
  27. }
8ehkhllq

8ehkhllq1#

Runnable n1 = Runner1::new 与此代码大致类似:

  1. Runnable n1 = () -> new Runner1();

换句话说
Runnable n1 将示例化 Runner1 当它被召唤的时候。
这不是您想要做的,而是您想要示例化 Runner1 并分配新的 Runner1n1 ,就像你对我一样 n2 .
使用 ::new 语法作为 Runnable 不是很有用,因为 Runnable 没有返回值。换句话说:你的
n1 Runnable 将示例化一个 Runner1 但不允许任何其他代码访问它。
路途 ::new 通常用于实现类似于 Supplier 这样地:

  1. Supplier<List<Object>> emptyListSuppier = ArrayList::new;

相关问题