我已经看过几种不同的方法来创建一个新的Thread,但是有一种方法我似乎已经忘记了,并且找不到很多它的例子,我想将它与另一种方式进行比较:< / p>
这个我似乎已经忘记了,我不确定它是否需要实现Runnable:
new Thread()
{
public void run()
{
System.out.println("running");
}
};
VS
new Thread(new Runnable()
{
public void run()
{
System.out.println("Running");
}
});
的差异?优点缺点?
什么时候应该创建匿名线程,何时实现Runnable?
答案 0 :(得分:3)
我刚刚看到,你接受了一个答案,之后我也无法抗拒自己在这里提供我的答案。
您的问题中没有Thread
子类的迹象,因此这里有延伸Thread
或实施Runnable
的消息。
在这里,您只需使用两种不同的构造函数,以两种不同的方式创建Thread
对象。在第二种情况下,您使用this版本的构造函数进行创建一个新的Thread
实例。当你的实例化线程运行时,你基本上提供了一个外部Runnable
对象来运行它的run方法。
Here是run
方法的源代码,您可以在run
,Thread
的{{1}} target
{如果您提供了方法,则调用方法!
与表演无关。您将使用哪个构造函数,这是您的用例问题。在最简单的情况下,我们通常不需要或使用第二个。
为解决任何困惑,您只需浏览源代码即可!
答案 1 :(得分:1)
如果您按照问题中的提法创建anonymous classes
,则没有明显差异。
但Thread t = new SubClassOfThread();
和Thread t = new Thread(new ClassImplementingRunnable)
之间存在区别
由于SubClassOfThread
扩展Thread
,您无法使用它来扩展任何其他类,如Runnable
的情况下,您可以再扩展一个类。
答案 2 :(得分:1)
我更喜欢第二种方式,因为它将Runnable
与Thread
分开。
第一种方法是创建一个扩展Thread
的新匿名类。但是你应该在“是一个”的意义上扩展另一个类。在你的例子中,这没关系,但是如果run方法的责任越来越大,那么说你的函数是Runnable
会更清楚,但不是它的主要目的是Thread
。
答案 3 :(得分:1)
最佳实践表明,您通常应该支持组合而不是继承。应用于您的问题,您的第一个示例创建Thread
的子类并覆盖其run
方法(继承),第二个示例实例化标准Thread
类,传递Runnable
,并根据需要实施run
方法(组合)。
如果由于打字错误或其他疏忽导致您Thread
方法无意中涉及run
(某种方法或字段)的成员,那么为什么后者才是最佳做法。一旦发生这种情况,你就可以找到可能非常奇怪行为的原因。