通过匿名类声明新线程的最佳方法是啥?

Posted

技术标签:

【中文标题】通过匿名类声明新线程的最佳方法是啥?【英文标题】:What's the best way to declare a new thread via an anonymous class?通过匿名类声明新线程的最佳方法是什么? 【发布时间】:2021-06-10 18:20:09 【问题描述】:

我一直在检查一些关于 Java 线程的技术资料,当我使用匿名类定义线程时(在构造函数定义中正确使用括号),我对一个特定问题有点困惑。 常规声明是这样的:

    Thread myRunnableThread3 = new Thread(new MyRunnable()
        @Override
        public void run() 
            System.out.println("myRunnableThread3!");
        
    );
    myRunnableThread3.start();

出于实验目的,我尝试了这个:

    Thread myRunnableThread3 = new Thread(new MyRunnable())
        @Override
        public void run() 
            System.out.println("myRunnableThread3!");
        
    ;
    myRunnableThread3.start();

如您所见,两者看起来非常相似,输出控制台也相同。 那么,我错过了什么吗?也许还有一点我还没有意识到的功能差异。顺便说一句,我使用的是 Java Corretto 11。 两者看起来都不错,也许我应该选择第一个选项? 感谢您的 cmets 和帮助。

【问题讨论】:

它们是不同的,因为它们创建了一个由不同事物组成的匿名类:MyRunnableThread。如果你问我,两者都不行。只需Thread myRunnableThread3 = new Thread(() -> System.out.println("myRunnableThread3!")) 就简单多了 什么是最好的方法”问题通常是基于意见的,因此,off-topic。 【参考方案1】:

首先是创建MyRunnable的匿名子类。

第二个是创建Thread的匿名子类,这要求MyRunnable是可实例化的;并且MyRunnable 实际上根本不会被使用,因为它没有在您在Thread 子类中定义的run() 方法中调用。

没有理由对Thread 进行子类化,并且可能您希望从MyRunnable 基类中获得一些特殊行为(尽管唯一能提供实际运行的特殊行为的是构造函数)。

使用第一种方式。

【讨论】:

是的,确实如此。我没有意识到那个具体的细节。即使它们看起来非常相似(至少对于像我这样的新手来说),括号也将构造函数和类声明体隔离开来。谢谢!最终,我将掌握 lambda 表达式,而函数式接口将在这些方面帮助我很多。【参考方案2】:

您也可以使用 lambda 表达式来启动线程。

Thread myRunnableThread3 = new Thread(()-> 
    System.out.println(Thread.currentThread().getName());
    System.out.println("myRunnableThread3!");,"MyThread");

    
myRunnableThread3.start();

打印

MyThread
myRunnableThread3!

【讨论】:

以上是关于通过匿名类声明新线程的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

通过匿名内部类方式使用多线程

java内部类与匿名内部类作用分别是啥?

匿名内部类创建线程,简化线程创建代码

“从 PlaceSelectionListener 派生的匿名类”类必须声明为抽象或实现抽象方法

匿名对象 内部类 包的声明与访问 访问修饰符

C#中的匿名类型