Вот мой пример кода:Как сделать нить ждать недо метод другого класса завершает
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()
.
Я пытаюсь сделать код работать таким образом, что поток secondly
запускается после завершения резьбы firstly
. Но я не могу заставить его работать. Случается, что всплывающее сообщение всплывает немедленно (и это означает, что он запускает поток, прежде чем я хочу его запустить).
Примечание: сообщение «только что закончилось» предназначено только для проверки кода. В моей «реальной» программе метод был бы на месте. Я делаю это примечание, потому что, если я просто хочу показать сообщение, я мог бы просто поместить его в конце метода doCaculations()
, и все будет работать нормально.
Я знаю, что я должен делать неправильно с обработкой Thread, но я не могу его найти. Есть идеи?
PS: Мысль: На самом деле метод doCaculations()
имеет свою собственную нить. Таким образом, он запускается «в SwingWorker внутри потока». Iguess firstly.join();
работает правильно. Но после того, как метод doCaculations()
называется потоком fistrly
, считается завершенным, и поэтому код продолжается с потоком secondly
, не зная, что поток doCaculations()
все еще что-то делает.
Я «расширяет тему» для класса вычислений, для того, чтобы использовать метод присоединиться на a, но ничего не меняется. Не могли бы вы дать более подробную информацию? – geo
Я думаю, что это неправильно, поскольку он использует SwingWorker – aalku
О, да, моя ошибка. Будет обновлен теперь мой пост для использования с Thread. – qiGuar