包含Thread成员的Runnable对象有什么问题吗?

时间:2013-09-02 20:35:24

标签: java multithreading

考虑以下对象:

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成员的事实?在我看来它似乎应该有效,但想到它会让我头痛,好像我在看一部克里斯托弗·诺兰的电影。

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

4 个答案:

答案 0 :(得分:1)

Runnable的想法是从实际的线程/执行组件中分离需要完成的事情。通过混合使用Runnable(使用扩展槽除外),您无法获得任何好处

在你的情况下,延长Thread并覆盖run()会得到相同的结果。

答案 1 :(得分: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()。如果您希望程序在程序启动后立即运行,则这两个选项都是选项,但在某些情况下,您可能更愿意先等待用户输入并从其他方法调用{{1}}。

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

答案 2 :(得分:0)

有效。

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

答案 3 :(得分: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();
  }
}