gpt4 book ai didi

Java线程问题

转载 作者:行者123 更新时间:2023-12-01 06:58:23 24 4
gpt4 key购买 nike

我正在开发一个 Java 应用程序,该应用程序需要每秒更新其结果,直到停止为止。在 30 秒内,它每秒都会调用一组特定的方法,然后在接下来的 30 秒内调用另一组方法,然后再次调用第一组方法,依此类推。由于我希望能够随时停止和重新启动在后台执行的计算,因此我制作了一个 GUI 和几个按钮来启动和停止新线程,以及显示结果的方法每秒。

我遇到的问题是,一旦新线程启动,我就无法切换回 GUI,直到它完成为止,并且由于线程将继续运行,直到我告诉它停止,所以我最终不会能够退出无限循环。我可以通过将 GUI 放置在它自己的线程中以便两个线程同时运行来解决这个问题吗?如果是这样,我将如何从 GUI 内部执行此操作?

我正在处理多个类(class),因此我不想发布不相关的内容。

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;
}

}

最佳答案

是的,您的 GUI 应该位于其自己的线程中。

您没有使用线程。您正在使用实现 Runnable 的自定义类。可运行!=线程。您想要这样做:

Thread thread = new Thread(new Threads());

当你想运行它时,使用

thread.start(); // not thread.run()!!

请注意,我正在将您的 Runnable 传递给真正的线程。我建议将您的 Threads 类重命名为更具体的名称。

所以,按照您现在的设置方式,您只是在与 GUI 相同的线程中运行 Runnable。使用上面的代码,您将生成一个新的执行线程。

关于Java线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5682635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com