在以下代码行中,当按下 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/