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