Я работаю над приложением на Java, которое требуется обновлять его результаты каждую секунду до его остановки. В течение 30 секунд он будет вызывать определенный набор методов каждую секунду, затем другой набор в течение следующих 30 секунд, затем первый набор снова и так далее. Поскольку я хочу иметь возможность останавливать и перезапускать вычисления, которые выполняются в фоновом режиме всякий раз, когда я хочу, я создал графический интерфейс и пару кнопок для запуска и остановки нового потока, а также средство для отображения результатов каждую секунду.Проблема с потоком Java
Проблема, с которой я столкнулся, заключается в том, что после запуска нового потока я не могу вернуться к графическому интерфейсу до тех пор, пока он не будет завершен, и поскольку поток будет продолжаться, пока я не остановлю его, я в конечном итоге не имея возможности выйти из бесконечного цикла. Могу ли я исправить это, поместив GUI в собственный поток, чтобы оба потока запускались одновременно? И если да, то как я буду делать это изнутри графического интерфейса?
Я работаю с несколькими классами, поэтому я не хочу публиковать неуместные материалы.
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;
}
}
Пожалуйста, разместите соответствующий код. – MByD
Почтовый индекс. Если вы действительно создали новый поток для выполнения работы, он не должен влиять на поток графического интерфейса. –
Статья, которая ответит на ваш вопрос и даст вам решение, которое поможет вам: [параллелизм в swing] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html) –