启动线程的不同方法有什么区别?

Ben*_*.Li 14 java multithreading

我有一个名为MyThread扩展Thread类并实现该run()函数的类.当我想运行它时,我有两种方法:

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

任何人都能区分出来吗?

T.J*_*der 19

因为你说你的课程延伸了 Thread,第二个课程有点多余.在你的第二个例子中,你没有使用你的课程Thread,你只是用它作为一个Runnable.

通常,你要么扩展Thread然后调用它自己的start(你的#1),要么你实现Runnable然后使用a Thread来运行它(你的#2).但你不会扩展Thread,然后使用另一个Thread来运行它.

在一个什么样的不同的术语,如果你需要做任何事情来控制或询问线程,在你的第一个情况下,你使用Thread上的实例方法类; 在第二种情况下,您将在您创建的实例上使用它们new Thread.如果你扩展Thread但是通过#2运行它,Thread你的实例上的方法是无关紧要的,可能会令人困惑.

最后一点可能更清楚,例子如下:

扩展示例Thread:

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();
Run Code Online (Sandbox Code Playgroud)

注意我们已经开始并通过foo引用加入了线程.

实施示例Runnable:

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();
Run Code Online (Sandbox Code Playgroud)

注意我们已经开始并通过thread引用加入了线程.

要这样做:

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();
Run Code Online (Sandbox Code Playgroud)

......因为现在你有Thread#join上均可用foothread; 哪个是正确的?(答案是:一个thread,但它很混乱,所以最好不要这样做.)

  • 当我考虑在现实生活中扩展线程时,我想不出一次.我认为最好的想法是告诉人们不要这样做,并依赖于这样一个事实:任何应该扩展它的人都会知道足够的知识来知道什么时候打破规则. (3认同)
  • 这是实际回答问题的唯一答案.两者有什么区别. (2认同)

wuc*_*ang 4

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

  1. 扩展Thread并使用new MyThreand().start()来启动您的线程。

  2. 实现Runnable接口。在这种情况下,您可以使用(new Thread(new MyThread)).start(); 启动一个线程。

详细信息请参考oracle官方文档。

  • 您也许不应该在第二个选项中调用 Runnable“MyThread”,这非常令人困惑。 (3认同)