首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启动线程的不同方式有什么不同?

问启动线程的不同方式有什么不同?
EN

Stack Overflow用户
提问于 2013-11-26 08:05:24
回答 8查看 2K关注 0票数 14

我有一个名为MyThread的类,它扩展了Thread类并实现了run() function.When,我想运行它,我有两种方法:

  1. 新建一个实例并调用该函数,如:new MyThread().start()
  2. 新建一个实例,并将实例作为参数传递给Thread的构造函数,然后调用Thread的开始函数。像这样:(new Thread(new MyThread)).start();

有谁能说出区别吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-11-26 08:13:41

嗯,你有两种方法来实现多线程。

  1. 扩展Thread并使用new MyThreand().start()启动线程。
  2. 实现Runnable接口。在这种情况下,可以使用(new Thread(new MyThread)).start();启动线程。

有关详细信息,只需参考甲骨文官方医生。

票数 4
EN

Stack Overflow用户

发布于 2013-11-26 08:12:32

因为您已经说过您的类扩展了Thread,所以第二个类有点多余。在第二个示例中,您不是将类用作Thread,而是将其用作Runnable。

通常,您可以扩展Thread,然后调用它自己的start (您的#1)、或--您将实现Runnable,然后使用Thread来运行它(您的#2)。但是您不会扩展Thread,然后使用另一个Thread来运行它。

就不同之处而言,如果您需要做任何事情来控制或询问线程,那么在第一种情况下,您将对类的实例使用Thread方法;在第二种情况下,您将在用new Thread创建的实例上使用它们。如果扩展Thread,但通过#2运行它,则实例上的Thread方法是不相关的,可能会引起混淆。

最后一点可能更清楚,举个例子:

扩展Thread的示例

代码语言:javascript
复制
class Foo extends Thread {
    public void run() {
        // ...
    }
}

// Create it
Foo foo = new Foo();

// Start it
foo.start();

// Wait for it to finish (for example)
foo.join();

注意,我们通过foo引用启动并加入了线程。

实现Runnable的示例

代码语言:javascript
复制
class Foo implements Runnable {
    public void run() {
        // ...
    }
}

// Create it
Foo foo = new Foo();

// Create a Thread to run it
Thread thread = new Thread(foo);

// Start it
thread.start();

// Wait for it to finish (for example)
thread.join();

注意,我们通过thread引用启动并加入了线程。

别这么做:

代码语言:javascript
复制
class Foo extends Thread {
    public void run() {
        // ...
    }
}

// Create it
Foo foo = new Foo();

// Create a Thread to run it -- DON'T do this
Thread thread = new Thread(foo);

// Start it
thread.start();

...because现在您在foo和thread上都有可用的Thread#join;哪个是合适的?(答案是:thread上的那个,但令人困惑,所以最好不要这么做。)

票数 19
EN

Stack Overflow用户

发布于 2013-11-26 08:12:53

您传递的MyThread实例只是充当Runnable,而不是作为单独的线程。

这两种方式在逻辑上基本上没有区别:

Thread内部在start()上所做的是,调用Runnable的run()方法。

当您执行new Thread(new MyThread()).start()时,您只是多余的,因为Thread本身实现了Runnable。

但这在逻辑上没有什么区别,因为新线程将调用MyThread的MyThread方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20211528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档