当我在 Java 中创建线程时,这里到底发生了什么?



Java 中的线程可以通过两种方式定义:

  1. 您可以实现 Runnable 接口。
  2. 您可以扩展 Thread 类本身。

这种创建线程的方法是什么?

Thread t = new Thread() {
    @Override
    public void run() {
        try {
            sleep(10000);
        } 
        catch (InterruptedException e) {
            System.err.println(e);
        }
        finally {
            finish();
        }
    }
};
t.start();

这是一个匿名类吗?这段代码工作正常,我确实测试了这段代码。但我不明白这里发生了什么。

是的,您的代码创建了一个匿名类。

这是匿名类???????????

是的,这是匿名内联类实现。当您想要使用内联类实现在本地创建类的线程对象时,将使用此方法。

这是匿名类吗? 是的,它是匿名类

阅读此内容以了解匿名类这里有很好的例子

你的代码在某种意义上等同于有一个单独的类,定义如下。

public class SleepyThread extends Thread {
    @Override
    public void run() {
        try {
            sleep(10000);
        } 
        catch (InterruptedException e) {
            System.err.println(e);
        }
        finally {
            finish();
        }
    }
}

然后有这样的代码。

Thread t = new SleepyThread();
t.start();

但是,由于您只需要在一个位置使用此类,因此无需为其命名或为其指定自己的源文件。 您可以简单地以您完成的方式内联类定义。

编译器仍将为其创建一个类文件,名称类似于 MyClass$1.class ,其中 MyClass 是你在其中使用它的类。 它只是"匿名",因为你没有给它一个名字。 它在各个方面仍然是一个成熟的班级。

这就是我们所说的匿名类,你说得对:--

Java 中的线程可以通过两种方式定义:

  • 您可以实现 Runnable 接口。
  • 您可以扩展 Thread 类本身。

    实际上,您在内部创建了一个扩展Thread类的子类的匿名类。所以在这里你的线程由第二个选项定义..!

  • 最新更新