繁体   English   中英

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

[英]Is there anything wrong with a Runnable object containing a Thread member?

考虑以下对象:

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()是否重要?

Runnable的想法是分离实际线程/执行组件需要完成的工作 通过混合两者,您不会从使用Runnable获得任何好处(除了不使用您的扩展槽

在你的情况下,扩展Thread并重写run()会得到相同的结果。

是的,它有效,但您可能需要考虑其他一些方法来实现这一点,并使您的代码更容易理解。 您可以创建第二个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()

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

有用。

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

这样做绝对没有意义,因为您运行的线程始终可以从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();
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM