0

考虑以下对象:

public class Mindblower implements Runnable {

    private Thread ownThread;        

    @Override
    public void run() {
        // do all the things
    }

    public Mindblower() {
        ownThread = new Thread(this);
        ownThread.start();
    }
}

这行得通吗?Thread 是被传递给 Thread 的 Runnable 的成员这一事实是否重要?在我看来它应该有效,但想想它让我头疼,就好像我在看克里斯托弗诺兰的电影一样。

对于奖励积分,是否.start()在 Runnable 的构造函数中调用是否重要?

4

4 回答 4

1

的想法是将需要做的事情与实际的线程/执行组件Runnable分开。通过混合两者,您不会从使用中获得任何好处(除了不使用您的extends slotRunnable

在您的情况下,扩展Thread和覆盖run()会得到相同的结果。

于 2013-09-02T20:39:12.053 回答
1

是的,它有效,但您可能需要考虑其他一些方法来完成此操作并使您的代码更易于理解。您可以创建第二个Runnable类从您的主类调用,例如:

public class Mindblower {

  public static void main(String[] args) {
    Thread ownThread = new Thread(new MindblowingRunnable());
    ownThread.start();

    // Other stuff that you want done concurrently on the main thread
  }

  private class MindblowingRunnable implements Runnable {
    @Override
    public void run() {
      // Stuff to be carried out in your thread
    }
  }
}

如果仅在该上下文中使用,这可以变得更简单Runnable,只要Runnable该类不需要是公共的:

public class Mindblower {

  public static void main(String[] args) {
    Thread ownThread = new MindblowingThread();
    ownThread.start();

    // Other stuff that you want done concurrently on the main thread
  }

  private class MindblowingThread extends Thread {
    @Override
    public void run() {
      // Stuff to be carried out in your thread
    }
  }
}

虽然您可以保留对线程的本地引用,但这仅在您需要从主线程中断它时才有用。从内部Runnable,只需调用Thread.currentThread()

对于您的奖励问题,不需要start()从构造函数调用,甚至不需要从main(). 如果您希望线程在程序启动后立即运行,这两个选项都是可选的,但在某些情况下,您可能更愿意先等待用户输入并start()从其他方法调用。

所有这些都假设您只创建一个线程,或者如果有多个线程,它们之间的同步对您的程序来说不是问题。如果同步很重要,请考虑使用线程池

于 2013-09-02T21:59:49.310 回答
0

有用。

但这是一个非常糟糕的做法

于 2013-09-02T20:37:25.163 回答
0

这样做绝对没有意义,因为您正在运行的线程始终可以从Thread.currentThread().

另外 - 如果你想自动启动,你应该使用这样的东西,但这仍然是不可取的。您班级的用户可能想要在开始您的线程之前做其他事情。

public class Mindblower implements Runnable {

  @Override
  public void run() {
    // You can access your thread at any time - you can even interrupt yourself.
    Thread.currentThread().interrupt();
  }

  public Mindblower() {
    // Do not start here.
  }

  {
    // A more acceptable way of having a self-starting thread but still not a good idea.
    new Thread(this).start();
  }
}
于 2013-09-02T21:19:36.030 回答