通过匿名类声明新线程的最佳方法是啥?
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 和帮助。
【问题讨论】:
它们是不同的,因为它们创建了一个由不同事物组成的匿名类:MyRunnable
和 Thread
。如果你问我,两者都不行。只需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!
【讨论】:
以上是关于通过匿名类声明新线程的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章