我想問一下如何設計應用程序的建議。目前,我想重寫一個統計應用程序將大數據處理成多線程版本。我的主要語言是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,));}
另一種解決方案可以加入計算算法和顯示結果到同一個線程,但它看起來醜陋:-)並打破了設計模式。
非常感謝您的幫助...
@ nandsito:感謝您的評論。問題在於計算,打印結果和更新場景都被連接到相同的線程和方法。它導致對類FunctionMT的巨大重新定義(引用表單,圖形對象等)。不幸的是,它打破了設計模式... – justik
@justik你的擔心是合法的。我更新了我的答案,請看看它是否適合您的需求 – nandsito
@ nandsito:感謝您的更新解決方案,將嘗試... – justik