Я хотел бы попросить совета, как разработать приложение. В настоящее время я хотел бы переписать статистическое приложение, обрабатывающее большие данные в многопоточную версию. Мой основной язык - C++, извините за мой слегка начинающий вопрос :-).Java, многопоточное приложение, рабочее главное окно при вычислении
Существующее приложение основано на следующей модели. Существует класс MainWindow, который непрерывно отображает предыдущие результаты, связанные с текущей операцией масштабирования (GUI). Каждое статистическое вычисление основано на собственном классе, собирающем входные данные, выполнении вычислений, показе результатов и их визуализации (на основе swing).
К сожалению, библиотека не написана как многопоточная. Это имеет нежелательные последствия: пока выполняется вычисление, невозможно работать с MainWindow (просмотр всех результатов до тех пор, пока не будут получены новые); она «заморожена» ...
Вчера я попытался предложить единое концептуальное обновление:
public class MainWindow extends JFame {
private void fButtonActionPerformed(java.awt.event.ActionEvent e) {
//Get data, single thread
Matrix A = getData(); //Input data (block matrix)
Matrix B; //Output data (block matrix)
//Computation in a separate thread
FunctionMT f = new FunctionMT (A, B);
Thread t = new Thread(f);
t.start(); // Starting the thread
//Display results in a form
results.print(B);
//Update graphic results
scene.update(B);
scene.repaint();
}
Функция выборки класс FunctionMT расширяет библиотеки потоков
public class FunctionMT extends Thread{
private final Matrix A;
private Matrix B;
public FunctionMT (final Matrix A_, Matrix B_) {A = A_; B = B_;}
public void run() { spDecomposition();}
public void spDecomposition() {
for (int i = 0; i < A.size; i++)
for (int j = 0; j < A.size; j++)
B(i,j) = f(A(i,));} //Some computationally hard step
}
матрица А является входная матрица, B представляет выход. Вычисление выполняется в одном потоке, работающем с экземпляром FunctionMT ...
Когда вычисление выполняется в одном потоке, можно работать с основным окном. К сожалению, результаты перекрашиваются до того, как вычисление будет остановлено.
Я пытался добавить метод Join()
...
Thread t = new Thread(f);
t.start(); // Starting the thread
try{t.join();} //Wait for its end
catch(InterruptedException e) {e.printStackTrace();}
results.print(B);
scene.update(B);
scene.repaint();
...
который ждет, пока результаты не processed.Unfortunately, это главное окно заморожен.
Как предложить многопоточное вычисление, позволяющее работать с основным окном во время вычисления, а также форму ждет до завершения вычисления?
Возможно ли добавить функцию, которая обрабатывает системные сообщения для цикла?
for (int i = 0; i < A.size; i++)
for (int j = 0; j < A.size; j++)
processSystemMessages();
B(i,j) = f(A(i,));}
Другим решением может присоединиться алгоритмы вычислений и показывать результаты в том же потоке, но это выглядит некрасиво :-) и ломает шаблон проектирования.
Большое спасибо за вашу помощь ...
@ nandsito: Спасибо за Ваш комментарий. Проблема заключается в том, что вычисления, результаты печати и обновление сцены соединяются с одним и тем же потоком и методом. Это приводит к огромному переопределению класса FunctionMT (ссылки на формы, графические объекты и т. Д.). К сожалению, это нарушает шаблон дизайна ... – justik
@justik ваше беспокойство законно. Я обновил свой ответ, посмотрю, подходит ли он вашим потребностям. – nandsito
@ nandsito: Спасибо за обновленное решение, попробуем ... – justik