2015-09-18 70 views
-3

我有下面的类行为螺纹通过扩展Thread类

public class Thread1 extends Thread { 
    @Override 
    public void run() { 
    System.out.println("I am the first thread"); 
    } 

public static void main(String args[]) { 
    Thread1 t = new Thread1(); 
    t.start(); 
} 

}

如果我运行上面的程序,将在新的线程立即打印

"I am the first thread" 

主如果我尝试两次启动相同的线程它会抛出java.lang.IllegalThreadStateException

否瓦特我将通过重写start()方法

public class Thread1 extends Thread { 
    @Override 
    public void run() { 
    System.out.println("I am the first thread"); 
    } 

    @Override 
    public void start() { 
    System.out.println("I am the Start"); 
    } 

    public static void main(String args[]) { 
    Thread1 t = new Thread1(); 
    t.start(); 
    t.start(); 
    } 
    } 

现在,如果我调用start()方法重写为下面的线程1类两倍的输出将是

I am in start 
    I am in start 

上述程序是抛出的任何异常。任何人都可以解释我这种行为。为什么它不启动新的线程。似乎是简单但不能理解它。

+3

你觉得'线程'的'start'实现了什么?如果你重写它,你期望会发生什么?你为什么这么认为? –

+0

阅读文档:http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#start-- –

+0

尝试在你重写的方法中调用'super.start()'并且看到怎么了。 – DoubleDouble

回答

1

@Override方法,你正在创建的新方法是什么将被称为,而不是以前的方法

在类Thread,start()是一个做一些东西,并启动线程的方法。

在你的新类Thread1start()是刚刚打印出一条线,没有别的方法


你的理解是正确的 - 即调用super.start()是调用父类的版本start()这是允许线程真正开始运行。

但请注意,在尝试运行两次时仍然会遇到该异常。这是Thread的设计方式。

从对问题的评论链接:

这是从来没有的法律,以启动一个线程不止一次。特别是,线程一旦完成执行就不会重新启动。