Java,多线程应用,计算时working main window

Java, multi-thread application,working main window when computing

请教如何设计应用程序。目前,我想将处理大数据的统计应用程序重写为多线程版本。我的主要语言是 C++,抱歉我的初学者问题:-)。

现有应用程序基于以下模型。有一个 MainWindow class 连续显示涉及当前缩放操作 (GUI) 的先前结果。每个统计计算都基于自己 class 获取输入数据、执行计算、显示结果及其可视化(基于 swing)。

遗憾的是,这个库没有写成多线程的。它有一个不良后果:虽然计算是 运行ning,但无法使用 MainWindow(浏览所有结果直到获得新结果);这是 "frozen"...

昨天,我试图提出一个概念更新:

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();
}

示例函数class 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 实例的单个线程中执行...

当计算在单线程中 运行 时,可以与主线程一起工作 window。不幸的是,结果在计算停止之前被重新绘制。

我尝试添加一个连接方法()

 ...
 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,它使主要 window 冻结。

如何提出一个多线程计算能够在计算过程中与主window一起工作以及表格等待计算完成?

是否可以在for循环中加入一些处理系统消息的函数?

for (int i = 0; i < A.size; i++)
     for (int j = 0; j < A.size; j++)
          processSystemMessages();
          B(i,j) = f(A(i,));}

另一种解决方案可能会将计算算法和结果显示到同一个线程中,但它看起来很难看:-)并且破坏了设计模式。

非常感谢您的帮助...

试试这个:

更新:松耦合

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