Java线程问题
|
我正在开发Java应用程序,该应用程序需要每秒更新其结果,直到停止为止。在30秒内,它将每秒调用一组特定的方法,然后在接下来的30秒内调用另一组,然后再次调用第一组,依此类推。由于我希望能够随时停止和重新启动在后台执行的计算,因此,我制作了一个GUI和几个按钮来启动和停止新线程,以及显示该线程的方法。结果每秒。
我遇到的问题是,一旦启动新线程,我就无法切换回GUI,直到完成为止,并且由于线程会一直运行直到我告诉它停止,所以最终我无法能够退出无限循环。我可以通过将GUI放置在自己的线程中以使两个线程同时运行来解决此问题吗?如果是这样,我将如何从GUI内部进行操作?
我正在与多个班级合作,所以我不想发布无关紧要的内容。
public class GUI extends javax.swing.JFrame implements Runnable{
Graphics g;
Threads thread = new Threads();
private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {
thread.run()
}
[..]
private void stopButtonActionPerformed(java.awt.event.ActionEvent evt) {
thread.stop()
}
}
public class Threads implements Runnable{
boolean opened=false;
road first = new road();
public void run() {
opened=true;
first.standardInitialization();
while(opened){
for(int i=0; i<30 && opened; i++){
try {
first.redLightAction();
System.out.println(\"cars: \" + first.firstLight.cars);
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(Threads.class.getName()).log(Level.SEVERE, null, ex);
}
}
for(int i=0; i<30 && opened; i++){
try {
first.greenLightAction();
second.greenLightAction();
System.out.println(\"cars: \" + first.firstLight.cars);
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(Threads.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
public void stop(){
opened=false;
}
}
没有找到相关结果
已邀请:
5 个回复
坍锭嘉韭蓝
当您要运行它时,请使用
注意,我正在将您的Runnable传递给真实的线程。我建议将您的Threads类重命名为更具体的名称。 因此,现在设置的方式就是在与GUI相同的线程中运行Runnable。使用上面的代码,您将产生一个新的线程来执行。
戒黑恳农
诫商
而不是
。 start方法实际上是一个导致新线程开始执行的方法(然后调用run()方法)。当您直接调用run()方法时,它只是一个常规方法调用,并且在调用(GUI)线程上执行,因此UI被阻止。
桑娠贯涤
琳娘
您的类中将有一个类似于上述框架的框架,该框架实现Runnable,然后创建一个线程,将其作为您的类的参数,最后启动它。 可以在http://www.brackeen.com/上找到有关游戏构建的更多信息。该人极力推荐有关Java游戏的精彩著作。 编辑1: 从我观察到的代码中,您可以很好地创建Thread,但应使用未运行的Thread的start方法启动它。 --->为什么由@Brad解释。 祝你好运,博罗。