java - 为什么我们不能直接在 Lambda 函数中调用 Thread#sleep()?

标签 java multithreading lambda java-8

下面的代码给了我一个编译时错误:

Thread t2 = new Thread(() -> {
    try { 
        sleep(1000);
    } 
    catch (InterruptedException e) {}
});

The method sleep(int) is undefined for the type A (where A is my class name).

然而,当我使用匿名内部类时,没有编译时错误:

Thread t1 = new Thread(){
    public void run(){
        try {
            sleep(1000);
        } catch (InterruptedException e) {}
    }
};

下面的代码也可以正常工作:

Thread t3 = new Thread(() -> System.out.println("In lambda"));

在 lambda 表达式主体中是如何工作的?请帮忙。

从许多答案中,我可以看到在我的第一种方法中使用 Thread.sleep(1000) 可以解决该错误。但是,如果有人能向我解释作用域和上下文如何在 lambda 表达式中工作,我将不胜感激。

最佳答案

Thread.sleepThread 类中的静态方法。

您可以在匿名类中直接调用 sleep 而无需任何限定符的原因是因为您实际上处于从 Thread 继承的类的上下文中。因此,sleep 可以在那里访问。

但是在 lambda 的情况下,你不在一个继承自 Thread 的类中。您在围绕该代码的任何类中。所以sleep不能直接调用,需要说Thread.sleepdocumentation也支持这个:

Lambda expressions are lexically scoped. This means that they do not inherit any names from a supertype or introduce a new level of scoping. Declarations in a lambda expression are interpreted just as they are in the enclosing environment.

基本上就是说,在 lambda 内部,您实际上与处于 lambda 外部的范围相同。如果你不能在 lambda 之外访问 sleep ,你也不能在里面。

另外,请注意,您在此处显示的创建线程的两种方法本质上是不同的。在 lambda 中,您将 Runnable 传递给 Thread 构造函数,而在匿名类中,您通过创建 Thread它的一个匿名类。

关于java - 为什么我们不能直接在 Lambda 函数中调用 Thread#sleep()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52602990/

相关文章:

java - 使用 JasperReports 在每个页面上创建折叠机的 OMR 图像

C# 线程方法名称预期错误

java - 何时适用于使用 CopyOnWriteArrayList

java - 为什么 Collection<T> 不实现 Stream<T>?

java - 使用流和 lambda 在 Java 8 中使用 if-else 条件

java - ByteBuffer putLong() 用于 long 的 7 字节值

java - 文件处理

java - 读取异步请求中的响应正文

python - 如何在 Python 中使用线程?

c++ - 在 C++11 lambda 中通过引用捕获引用