如果我有一个实现Runnable接口的类,那么主方法中这些语句之间有什么区别?这两种启动线程的方式有什么区别?
MyThread t1 = new MyThread();
t1.start();
和
MyThread t2 = new MyThread();
new Thread(t2).start();
如果我有一个实现Runnable接口的类,那么主方法中这些语句之间有什么区别?这两种启动线程的方式有什么区别?
MyThread t1 = new MyThread();
t1.start();
和
MyThread t2 = new MyThread();
new Thread(t2).start();
在第二个中,您创建了一个不包含在变量中的新线程并启动此新线程。 t2保持不变。
在创建T1开始第一个...
我认为,第二次是没有意义的
每当你的类必须扩展另一个类,使用Runnable接口。
而Runnable接口只包含run方法不启动。
既然你做了t1.start()
,我假设MyThread扩展了Thread。在这种情况下,第一个是正确的。
第二个创建一个新线程,然后在另一个线程中启动任务。一个线程被浪费了。
没有线程被浪费。只有在调用start()时才会创建一个新线程,而且只有一次调用该线程... – Zed 2009-08-12 07:03:46
要在Java中实现一个线程,你基本上有两种选择。一:扩展Thread类并实现方法运行。你的例子似乎就是这种情况。在这种情况下,你应该调用Thread.class的start()方法。这是你提供的两个变种之一。
第二个变体是如果您实现Runnable接口。在这种情况下,你也实现了run方法,但是你的类没有开始,所以你创建了一个新的Thread类,并将Runnable作为参数(就像你在第二个例子中那样)。但是如果你已经扩展了Thread,那没有任何意义。
我个人比较喜欢实现Runnable,因为我不改变Thread的行为(可以扩展它),但只使用Thread-functional。
假设MyThread
只实现Runnable
接口,第二个代码片段是使用正确的模式。 Thread.start()
链接到本地方法,将鼓起一个新的线程。然后它会调用它自己的run()
,这将在其实例Runnable
变量上调用run()
。在您的第二个代码片段中,这将是MyThread
的一个实例,您的Runnable
。
第一代码片段,给你提供的信息,将不能编译,除非:
start
方法。如果是这种情况,您的代码将不会鼓舞一个新线程,并且您只会按照MyThread.start()
中定义的当前线程中的流程进行操作。Thread
以及执行Runnable
。如果是这种情况,则Runnable
接口是冗余的,因为Thread
也实现了此接口。另外,如果你重写start
方法,你应该小心,因为如果你想鼓励一个新的线程需要调用超级方法。出于这个原因,至少有一个班只实施Runnable
而不是Thread
。此外,如果您只实施Runnable
,最好不要在名称中使用Thread
这个词。假设
class MyThread extends Thread
你第一个电话开始你的代码在一个新的线程。
呼叫
new Thread(new MyThread()).start();
将太运行MyThread的代码,例如,Thread构造只需要实现Runnable接口和run()方法的对象。你的MyThread类已经有了这个方法,所以它将被简单的包装线程执行。还要注意你的新MyThread基本上是一个未启动的线程。
你可以试试下面的小程序:
public class MyThread extends Thread {
public void run() {
if (Thread.currentThread() != this) {
System.out.println("Wrapped into a separate thread");
start();
} else {
System.out.println("MyThread run as expected");
}
}
public static void main(String[] args) {
new Thread(new MyThread()).start();
}
}
为了使它不那么混乱,由于名字让我们看看另一个例子:
public class MyJPanel extends JPanel implements Runnable {
public void run() {
System.out.println("Hello MyJPanel");
}
public static void main(String[] args) {
new Thread(new MyJPanel()).start();
}
}
MyThread的T1 =新MyThread的( ); t1.start();
将编译时异常
MyThread的T2 =新MyThread的();新线程(t2).start();
将工作fine.runnable接口没有启动方法。
Runnable接口没有start()方法,所以你的第一次调用会失败。 – Zed 2009-08-12 06:22:35
但是这看起来不像是一个实现的Runnable接口,而是像一个扩展的Thread-class。 – Mnementh 2009-08-12 07:16:24
“如果我有一个实现Runnable接口的类...” – Zed 2009-08-12 10:37:50