這裏是我的示例代碼:如何使線程等待另一個類的,直到方法完成
package javaapplication35;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import static javaapplication35.ProgressBarExample.customProgressBar;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
public class ProgressBarExample {
final static JButton myButton =new JButton("Start");
final static JProgressBar customProgressBar = new JProgressBar();
private static final JPanel myPanel = new JPanel();
public static void main(String[] args) {
customProgressBar.setMaximum(32);
customProgressBar.setStringPainted(true);
myPanel.add(customProgressBar);
myPanel.add(myButton);
myButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
Thread firstly =new Thread(new Runnable (
) {
@Override
public void run() {
Calculations a = new Calculations();
a.doCaculations();
}
});
Thread secondly =new Thread(new Runnable (
) {
@Override
public void run() {
JOptionPane.showMessageDialog(null,"just finished");
}
});
firstly.start();
try {
firstly.join();
} catch (InterruptedException ex) {
Logger.getLogger(ProgressBarExample.class.getName()).log(Level.SEVERE, null, ex);
}
secondly.start();
}
});
JOptionPane.showMessageDialog(null, myPanel, "Progress bar test", JOptionPane.PLAIN_MESSAGE);
}
}
class Calculations {
public void doCaculations() {
new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
int value = 0;
while (value < customProgressBar.getMaximum()) {
Thread.sleep(250);
value ++;
customProgressBar.setValue(value);
}
return null;
}
}.execute();
}
private void doOtherStaff(){
//more methods, that don't need to run in seperate threads, exist
}
}
有2個線程。 firstly
線程創建一個Calculations
類的監督,然後對其運行doCaculations()
方法。 secondly
線程彈出消息。
在我的「真實」代碼中的doCaculations()
方法執行一些耗時的數學計算,並且爲了模擬我添加的時間Thread.sleep(250);
。我需要通知用戶計算進度,因此我正在使用進度條,該進度條由doCaculations()
方法更新。
我試圖讓線程在線程完成後線程運行的方式工作。但我無法讓它工作。會發生什麼是彈出消息立即彈出(這意味着它是線程運行之前,我希望它運行)。
注意:「剛完成」消息只是爲了測試代碼。在我的「真實」程序中,一個方法就在它的位置上。我正在做這個筆記,因爲如果我只是想要一個消息顯示我可以將它放在doCaculations()
方法的末尾,並且一切都會正常工作。
我知道我必須在線程處理方面做錯了,但是我找不到它。有任何想法嗎?
PS:一個想法:實際上doCaculations()
方法有它自己的線程。所以它在「線程內的SwingWorker」中運行。 Iguess firstly.join();
正常工作。但在doCaculations()
方法被調用後,fistrly
線程被認爲已完成,這就是代碼繼續執行secondly
線程的原因,但不知道doCaculations()
線程仍在執行某些操作。
我用於分類計算「繼承Thread」,以使用join方法上,但沒有什麼變化。你能提供更多細節嗎? – geo
我認爲這是錯誤的,因爲他使用的是SwingWorker – aalku
哦,是的,我的錯誤。現在將更新我的帖子以與Thread一起使用。 – qiGuar