2009-08-12 73 views
0

如果我有一个实现Runnable接口的类,那么主方法中这些语句之间有什么区别?这两种启动线程的方式有什么区别?

MyThread t1 = new MyThread(); 
t1.start(); 

MyThread t2 = new MyThread(); 
new Thread(t2).start(); 
+4

Runnable接口没有start()方法,所以你的第一次调用会失败。 – Zed 2009-08-12 06:22:35

+0

但是这看起来不像是一个实现的Runnable接口,而是像一个扩展的Thread-class。 – Mnementh 2009-08-12 07:16:24

+0

“如果我有一个实现Runnable接口的类...” – Zed 2009-08-12 10:37:50

回答

0

第一次调用(如果这将是一个run())在当前线程将执行,而第二个将创建一个能够运行运行一个新的线程( )你的Runnable的方法。

+0

但他没有调用run(),他调用了start()。 – Mnementh 2009-08-12 07:04:02

+0

因此,我的意见下面的问题... – Zed 2009-08-12 10:36:26

0

在第二个中,您创建了一个不包含在变量中的新线程并启动此新线程。 t2保持不变。

在创建T1开始第一个...

我认为,第二次是没有意义的

0

每当你的类必须扩展另一个类,使用Runnable接口。

而Runnable接口只包含run方法不启动。

1

既然你做了t1.start(),我假设MyThread扩展了Thread。在这种情况下,第一个是正确的。

第二个创建一个新线程,然后在另一个线程中启动任务。一个线程被浪费了。

+0

没有线程被浪费。只有在调用start()时才会创建一个新线程,而且只有一次调用该线程... – Zed 2009-08-12 07:03:46

1

要在Java中实现一个线程,你基本上有两种选择。一:扩展Thread类并实现方法运行。你的例子似乎就是这种情况。在这种情况下,你应该调用Thread.class的start()方法。这是你提供的两个变种之一。

第二个变体是如果您实现Runnable接口。在这种情况下,你也实现了run方法,但是你的类没有开始,所以你创建了一个新的Thread类,并将Runnable作为参数(就像你在第二个例子中那样)。但是如果你已经扩展了Thread,那没有任何意义。

我个人比较喜欢实现Runnable,因为我不改变Thread的行为(可以扩展它),但只使用Thread-functional。

0

假设MyThread只实现Runnable接口,第二个代码片段是使用正确的模式。 Thread.start()链接到本地​​方法,将鼓起一个新的线程。然后它会调用它自己的run(),这将在其实例Runnable变量上调用run()。在您的第二个代码片段中,这将是MyThread的一个实例,您的Runnable

第一代码片段,给你提供的信息,将不能编译,除非:

  • 您已经实现了你自己的一个start方法。如果是这种情况,您的代码将不会鼓舞一个新线程,并且您只会按照MyThread.start()中定义的当前线程中的流程进行操作。
  • 您实际上已扩展Thread以及执行Runnable。如果是这种情况,则Runnable接口是冗余的,因为Thread也实现了此接口。另外,如果你重写start方法,你应该小心,因为如果你想鼓励一个新的线程需要调用超级方法。出于这个原因,至少有一个班只实施Runnable而不是Thread。此外,如果您只实施Runnable,最好不要在名称中使用Thread这个词。
1

假设

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(); 
    } 
} 
0

MyThread的T1 =新MyThread的( ); t1.start();

将编译时异常

MyThread的T2 =新MyThread的();新线程(t2).start();

将工作fine.runnable接口没有启动方法。

相关问题