Java,多线程应用程序,运行时的主窗口
问题描述:
我想问一下如何设计应用程序的建议。目前,我想重写一个统计应用程序将大数据处理成多线程版本。我的主要语言是C++,对于我的稍微初学者的问题抱歉:-)。Java,多线程应用程序,运行时的主窗口
现有的应用程序基于以下模型。有一个MainWindow类持续显示涉及当前缩放操作(GUI)的先前结果。每一次统计计算都是基于自己的课程来获取输入数据,执行计算,显示结果及其可视化(基于挥杆)。
不幸的是,库不是写成多线程的。它有一个不希望的后果:在计算运行时,不可能使用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
}
矩阵A是输入矩阵,B代表输出。计算是在一个使用FunctionMT实例的单线程中执行的...
当计算在单个线程中运行时,可以使用主窗口。不幸的是,结果在计算停止前被重新绘制。
我尝试添加该等待,直到结果processed.Unfortunately,它使冻结的主窗口中的连接方法()
...
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();
...
。
如何提出一个多线程计算,以便能够在计算过程中使用主窗口以及表单等待计算完成?
是否可以添加一些函数来处理系统消息进入循环?
for (int i = 0; i < A.size; i++)
for (int j = 0; j < A.size; j++)
processSystemMessages();
B(i,j) = f(A(i,));}
另一种解决方案可以加入计算算法和显示结果到同一个线程,但它看起来丑陋:-)并打破了设计模式。
非常感谢您的帮助...
答
试试这个:
UPDATE:松耦合
public class MainWindow extends JFrame {
private void fButtonActionPerformed(java.awt.event.ActionEvent e) {
// ...
FunctionMT f = new FunctionMT (A, B, new Runnable() {
@Override
public void run() {
results.print(B);
scene.update(B);
scene.repaint();
}
});
Thread t = new Thread(f);
t.start();
// Wait for computation:
// won't do it here.
// results.print(B);
// scene.update(B);
// scene.repaint();
}
}
public class FunctionMT extends Runnable {
// ...
private Runnable callback;
public FunctionMT (final Matrix A_, Matrix B_, Runnable callback) {
// ...
this.callback = callback;
}
private void spDecomposition() {
// Do computation.
SwingUtilities.invokeLater(callback);
}
}
@ nandsito:感谢您的评论。问题在于计算,打印结果和更新场景都被连接到相同的线程和方法。它导致对类FunctionMT的巨大重新定义(引用表单,图形对象等)。不幸的是,它打破了设计模式... – justik
@justik你的担心是合法的。我更新了我的答案,请看看它是否适合您的需求 – nandsito
@ nandsito:感谢您的更新解决方案,将尝试... – justik