[英]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.