java - 不同的线程启动方式有什么区别?

标签 java multithreading

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

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

谁能说出区别?

最佳答案

因为您说过您的类(class)扩展 Thread ,第二个有点多余。在您的第二个示例中,您没有将您的类(class)用作 Thread ,您只是将其用作 Runnable .

通常,您要么扩展 Thread然后调用自己的start (你的#1),或者你会实现Runnable然后使用 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();

请注意,我们通过 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();

请注意,我们通过 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();

...因为现在你有 Thread#join可用于 foothread ;哪个是正确的使用? (答案是:thread 上的那个,但很容易混淆,所以最好不要那样做。)

关于java - 不同的线程启动方式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20211528/

相关文章:

java - 如何将字符串发送到 GWT DataGrid?

python - 多线程性能开销

c++ - 两个线程访问单例类 - 无法正常工作

java - java.lang.Class 方法线程安全吗?

python - 我怎样才能让这个计时器永远运行?

Java json 解析

java - 动态名称变量java(解析器创建结构)

java - 静态类未加载

java - 限制 Java 中的线程执行处理器周期

multithreading - 获取 RwLock 进行读取并使其超出范围