请在这方面给我一些生动的解释。 我尝试了很多,但我无法理解。
我完全搞砸了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的编程的线程概念。
答案 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()
方法并从调用方法中调用它。