如果start()方法在它自己的体内调用,Thread程序会发生什么?

时间:2014-10-08 13:55:56

标签: java multithreading

请在这方面给我一些生动的解释。  我尝试了很多,但我无法理解。

我完全搞砸了start方法的代码段,在下面的程序中调用就像重复一样,甚至在进入start方法体之前第一次调用start方法。

提前致谢。

package appletexample;
import java.awt.*;
import java.applet.*;
public class AppletOne extends Applet implements Runnable {

    String str = "This is a simple Banner ";
    Thread t ;
    boolean b;

    public void init() {
          setBackground(Color.gray);
          setForeground(Color.yellow);
    }

    public void start() {
          t = new Thread(this);
          b = false;
          t.start();
    }

    public void run () {
          char ch;
          for( ; ; ) {
              try {
                  repaint();
                  Thread.sleep(200);
                  ch = str.charAt(0);
                  str = str.substring(1, str.length());
                  str = str + ch;
              } catch(InterruptedException e) {}
          }
    }

    public void paint(Graphics g) {
          g.drawRect(1,1,300,150);
          g.setColor(Color.yellow);
          g.fillRect(1,1,300,150);
          g.setColor(Color.red);
          g.drawString(str, 1, 150);
    }
}

我甚至是线程概念的新手请给我清楚相关的图片。并给我一些参考网站,以了解小程序和基于Web的编程的线程概念。

2 个答案:

答案 0 :(得分:3)

您无法在已经启动的主题上致电start() - 您将获得IllegalThreadStateException。但是,您的计划并没有这样做。

在applet的start方法中,您创建了一个Thread并将applet本身作为Runnable参数传递。这意味着当线程启动时,它会调用applet的run方法。然后在线程上调用start()以启动它运行。但是您在线程上调用了start(),而不是applet,因此您不会再意外地运行applet自己的start方法。这里没有发生递归。


但是,您正在启动一个主题并且永远不会停止它。那很糟糕。您的applet需要自行清理,即使在applet本身被销毁之后也不会让线程永远运行。这样做的方法是:

首先,让您的run方法实际响应线程中断。在catch (InterruptedException e)块中,添加return语句而不是忽略该异常。 (有关线程中断的更多信息,请参阅this article。)

其次,在您的小程序中添加stop()方法 - 例如start(),这是在Applet类中定义的,并且当它被'时自动调用它。小程序停止的时间。

第三,在新的stop()方法中,t.interrupt()后跟t.join()。这将告诉线程它应该停止运行,然后等待它这样做。

答案 1 :(得分:0)

以下代码段并非完全是最佳做法,start()方法几乎永远不会被覆盖。

public void start()
   {
      t = new Thread(this);
      b = false;
      t.start();
   }

重命名start()方法并从调用方法中调用它。

相关问题