当我';我正在用Java创建一个线程?

当我';我正在用Java创建一个线程?,java,multithreading,Java,Multithreading,Java中的线程可以通过两种方式定义: 您可以实现Runnable接口 您可以扩展Thread类本身 这种创建线程的方法是什么 Thread t = new Thread() { @Override public void run() { try { sleep(10000); } catch (InterruptedException e) { System.err.println

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

  • 您可以实现Runnable接口
  • 您可以扩展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();
    
    然后有这样的代码

    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类。
    因此,这里您的线程由第二个选项定义

    这里给出了一个引用:“java中的匿名类是一个没有给出名称的类,它在一个语句中都被声明和实例化。当你需要创建一个只实例化一个类时,你应该考虑使用匿名类。”但我没有在我的代码中提供任何构造函数?????我同意你的说法,但我的问题是“java线程需要通过扩展线程类来创建,但我没有扩展任何类”我只是使用匿名类。。。。换句话说,匿名类意味着扩展任何超级类?????:)现在我对匿名类有了一些了解。。。非常感谢