【发布时间】:2017-03-26 12:50:07
【问题描述】:
我想请教如何设计应用程序。目前,我想将一个处理大数据的统计应用程序重写为多线程版本。我的主要语言是 C++,抱歉我的初学者问题:-)。
现有应用程序基于以下模型。有一个 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 扩展了 Thread 库
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 实例的单个线程中执行...
当计算在单线程中运行时,可以使用主窗口。不幸的是,在计算停止之前重新绘制结果。
我尝试添加一个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();
...
等待处理结果。不幸的是,它使主窗口冻结。
如何提出一个多线程计算,以便在计算期间能够与主窗口一起工作以及表单等待计算完成?
是否可以在循环中添加一些处理系统消息的函数?
for (int i = 0; i < A.size; i++)
for (int j = 0; j < A.size; j++)
processSystemMessages();
B(i,j) = f(A(i,));}
另一种解决方案可能会加入计算算法并将结果显示到同一个线程中,但它看起来很丑 :-) 并破坏了设计模式。
非常感谢您的帮助...
【问题讨论】:
标签: java multithreading computation