2016-11-12 101 views
2

我想问一下如何设计应用程序的建议。目前,我想重写一个统计应用程序将大数据处理成多线程版本。我的主要语言是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,));} 

另一种解决方案可以加入计算算法和显示结果到同一个线程,但它看起来丑陋:-)并打破了设计模式。

非常感谢您的帮助...

回答

2

试试这个:

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); 
    } 
} 
+0

@ nandsito:感谢您的评论。问题在于计算,打印结果和更新场景都被连接到相同的线程和方法。它导致对类FunctionMT的巨大重新定义(引用表单,图形对象等)。不幸的是,它打破了设计模式... – justik

+0

@justik你的担心是合法的。我更新了我的答案,请看看它是否适合您的需求 – nandsito

+0

@ nandsito:感谢您的更新解决方案,将尝试... – justik