制作线程的差异?

时间:2014-02-16 18:06:46

标签: java multithreading conventions

我已经看过几种不同的方法来创建一个新的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?

4 个答案:

答案 0 :(得分:3)

我刚刚看到,你接受了一个答案,之后我也无法抗拒自己在这里提供我的答案。

您的问题中没有Thread子类的迹象,因此这里有延伸Thread或实施Runnable的消息。

在这里,您只需使用两种不同的构造函数,以两种不同的方式创建Thread对象。在第二种情况下,您使用this版本的构造函数进行创建一个新的Thread实例。当你的实例化线程运行时,你基本上提供了一个外部Runnable对象来运行它的run方法。

Hererun方法的源代码,您可以在runThread的{​​{1}} target {如果您提供了方法,则调用方法!

与表演无关。您将使用哪个构造函数,这是您的用例问题。在最简单的情况下,我们通常不需要或使用第二个。

为解决任何困惑,您只需浏览源代码即可!

答案 1 :(得分:1)

如果您按照问题中的提法创建anonymous classes,则没有明显差异。

Thread t = new SubClassOfThread();Thread t = new Thread(new ClassImplementingRunnable)之间存在区别

由于SubClassOfThread扩展Thread,您无法使用它来扩展任何其他类,如Runnable的情况下,您可以再扩展一个类。

答案 2 :(得分:1)

我更喜欢第二种方式,因为它将RunnableThread分开。

第一种方法是创建一个扩展Thread的新匿名类。但是你应该在“是一个”的意义上扩展另一个类。在你的例子中,这没关系,但是如果run方法的责任越来越大,那么说你的函数是Runnable会更清楚,但不是它的主要目的是Thread

答案 3 :(得分:1)

最佳实践表明,您通常应该支持组合而不是继承。应用于您的问题,您的第一个示例创建Thread的子类并覆盖其run方法(继承),第二个示例实例化标准Thread类,传递Runnable,并根据需要实施run方法(组合)。

如果由于打字错误或其他疏忽导致您Thread方法无意中涉及run(某种方法或字段)的成员,那么为什么后者才是最佳做法。一旦发生这种情况,你就可以找到可能非常奇怪行为的原因。

相关问题