java - 从 JButton ActionPerformed 调用耗时的方法

标签 java multithreading swing jbutton event-dispatch-thread

在以下代码行中,当按下 Button1 时,Jframe 将变得无响应,直到encode() 方法执行完成为止。但我需要更新 Jframe 中显示进度的进度条。

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) {                                   
    try {
        if (flagState == 0) {
            WavFile.decode(readWavFile, msg.getText(), key.getText().hashCode());
        } else if (flagState == 1) {
            WavFile.encode(readWavFile, msg.getText(), key.getText().hashCode());            
        }
    } catch (WavFileException | IOException e) {
        notes.setText(e.getMessage());
    }
}         

我想过这样做

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) {                                   
    try {
        if (flagState == 0) {
            Thread t = new Thread(new Runnable() {
                               public void run() {
                                  WavFile.decode(readWavFile, msg.getText(), key.getText().hashCode()); 
                               }
                            };)
            t.start();
        } else if (flagState == 1) {
            Thread t = new Thread(new Runnable() {
                               public void run() {
                                  WavFile.encode(readWavFile, msg.getText(), key.getText().hashCode()); 
                               }
                            };)
            t.start();
        }
    } catch (WavFileException | IOException e) {
        notes.setText(e.getMessage());
    }
} 

并通过encode()方法更新进度条。

但我知道这将在模块之间产生强耦合,但我不希望这样。

我也不认为每次都调用一个新线程是一个好主意(想到了 ExecutorService 但不知道如何使用它)。

我应该怎么做才能使它成为一个像样的代码?

最佳答案

线程肯定是这里不得不介绍的东西。任何需要大量时间才能完成的事情都不应该在 awt 事件线程中运行。

每次单击按钮时生成一个新线程本质上并不是问题。不过,您应该考虑到,在第一个线程完成之前,可能会产生许多线程来做同样的事情。如果需要,您可以使用执行器,但这可能不是必需的。

至于跟踪进度,我将添加另一个线程,该线程定期查询另一个线程并根据需要更新进度栏。以下是我的结构:

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) {
    disableButton1();
    final Thread t;
    if (flagState == 0) {
        t = new Thread(new Runnable() {
            public void run() {
                try {
                    WavFile.decode(readWavFile, msg.getText(), key.getText().hashCode());
                } catch (WavFileException | IOException e) {
                    notes.setText(e.getMessage());
                }
            }
        });
    } else if (flagState == 1) {
        t = new Thread(new Runnable() {
            public void run() {
                try {
                    WavFile.encode(readWavFile, msg.getText(), key.getText().hashCode()); 
                } catch (WavFileException | IOException e) {
                    notes.setText(e.getMessage());
                }
            }
        });
    }

    Thread monitor = new Thread(new Runnable() {
        public void run() {
            try {
                while (notComplete(t)) {
                    setProgressBar(getProgress(t));
                    Thread.sleep(SLEEP_TIME);
                }
                t.join();
            } finally {
                enableButton1();
            }
        }
    });

    t.start();
    monitor.start();
}

关于java - 从 JButton ActionPerformed 调用耗时的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12357183/

相关文章:

java - 如何从通过 MyBatis 映射器方法调用的 PostgreSQL 函数获取服务器消息(引发通知)?

java - 将参数化类型作为参数传递给方法

java - run()方法执行完后线程会自动关闭吗?

c++ - 如何在 Qt 中高效显示 OpenCV 视频?

java - 组件分层 Java Swing,悬停时显示层

java - 这是在 Java 中重复方法调用的最干净的方法吗?

java - 如何访问线程中 Runnable 对象的字段

windows - 为什么它像没有线程一样运行?

java - 我怎样才能让这个timer()按我想要的方式工作?

java - JTextArea 到文件