Java线程问题

标签 java multithreading swing user-interface netbeans

我正在开发一个 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/

相关文章:

java - 无法获取文本字符串的值

Java - 程序无法编译/方法 getText(double)

java - 如何对@Any 注释属性进行双向映射?

java - block 级同步

iOS/OSX 相当于 SetEvent() 和 WaitForSingleObject()?

java - 我没有得到两个相似的 JFrame,而是得到了一个带有双组件的 JFrame

java - 异步方法调用完成后,Spring 命令行应用程序挂起

Java ScheduledExecutorService - 防止多个并行任务中的饥饿

multithreading - 什么是FIFO存储缓冲区中的本地旁路?

c# - 从异步回调方法与 UI 线程交互?