了解Java中两种Thread实现方式的区别?

问题描述 投票:0回答:1

我正在学习 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 的条件是什么?这两种方法之间有什么技术差异?

java multithreading java-11 runnable method-reference
1个回答
0
投票

这段代码

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));
© www.soinside.com 2019 - 2024. All rights reserved.