Matlab&;Java:异步执行matlab
所以,我今天的问题是: 首先,请注意,我没有可用的Matlab并行工具箱 我正在运行与Matlab交互的java代码。有时Matlab直接调用一些java函数,有时正好相反。在这种情况下,我们使用的通知系统如下: 然后,我们在适当的回调中处理通知 下面是一个简单的用例:Matlab&;Java:异步执行matlab,java,multithreading,matlab,asynchronous,synchronous,Java,Multithreading,Matlab,Asynchronous,Synchronous,所以,我今天的问题是: 首先,请注意,我没有可用的Matlab并行工具箱 我正在运行与Matlab交互的java代码。有时Matlab直接调用一些java函数,有时正好相反。在这种情况下,我们使用的通知系统如下: 然后,我们在适当的回调中处理通知 下面是一个简单的用例: 我的用户使用java界面选择一个配置文件,加载到Matlab中 使用接口侦听器,我们通知Matlab已选择配置文件,然后它运行一定数量的函数来分析该文件 分析完成后,它将被推送到java运行时,java运行时将用结果填充接口
- 我的用户使用java界面选择一个配置文件,加载到Matlab中
- 使用接口侦听器,我们通知Matlab已选择配置文件,然后它运行一定数量的函数来分析该文件
- 分析完成后,它将被推送到java运行时,java运行时将用结果填充接口表。这一步需要matlab调用java函数
- 最后,java请求将接口切换到任意决定的选项卡
@Override
public void actionPerformed(ActionEvent arg0) {
Model wModel = controller.getModel();
Window wWindow = controller.getWindow();
MatlabStructure wStructure = new MatlabStructure();
if(null != wModel) {
wModel.readMatlabData(wStructure);
wModel.notifyMatlab(wStructure, MatlabAction.UpdateCircuit);
}
if(null != wWindow) {
wWindow.getTabContainer().setSelectedComponent(wWindow.getInfosPannel());
}
}
这里发生的事情是,当调用notifyMatlab方法时,代码不会等待它完成后再继续。因此,方法完成并切换到一个空的接口页(setSelectedComponent),然后组件中填充了值
我想让java等待notifyMatlab返回一个“I have completed!!”信号,然后继续。这涉及异步代码,因为Matlab在执行过程中也会编写java方法
到目前为止,我已经尝试过了:
在MatlabEventObject类中,我添加了一个isAcknowledge成员,因此现在该类(我最初在上面的链接中找到)如下所示(我从原始类中删除了所有未更改的代码):
在MatlabEvent类中,我添加了一个未来任务,目标是等待确认,方法现在如下所示:
public class MatlabEvent {
private Vector<IMatlabListener> data = new Vector<IMatlabListener>();
private Vector<MatlabEventObject> matlabEvents = new Vector<MatlabEventObject>();
public void notifyMatlab(final Object obj, final MatlabAction action) {
final Vector<IMatlabListener> dataCopy;
matlabEvents.clear();
synchronized (this) {
dataCopy = new Vector<IMatlabListener>(data);
}
for (int i = 0; i < dataCopy.size(); i++) {
matlabEvents.add(new MatlabEventObject(this, obj, action));
((IMatlabListener) dataCopy.elementAt(i)).testEvent(matlabEvents.get(i));
}
}
public void onNotificationReceived() {
ExecutorService service = Executors.newSingleThreadExecutor();
long timeout = 15;
System.out.println("Executing runnable.");
Runnable r = new Runnable() {
@Override
public void run() {
waitForAcknowledgement(matlabEvents);
}
};
try {
Future<?> task = service.submit(r);
task.get(timeout, TimeUnit.SECONDS);
System.out.println("Notification acknowledged.");
} catch (Exception e) {
e.printStackTrace();
}
}
private void waitForAcknowledgement(final Vector<MatlabEventObject> matlabEvents) {
boolean allEventsAcknowledged = false;
while(!allEventsAcknowledged) {
allEventsAcknowledged = true;
for(MatlabEventObject eventObject : matlabEvents) {
if(!eventObject.isAcknowledged()) {
allEventsAcknowledged = false;
}
break;
}
}
}
}
公共类MatlabEvent{
私有向量数据=新向量();
私有向量matlabEvents=新向量();
公共对象(最终对象对象、最终MatlabAction动作){
最终矢量数据拷贝;
matlabEvents.clear();
已同步(此){
数据拷贝=新向量(数据);
}
对于(int i=0;i
我发现Matlab实际上是在等待java代码的完成。所以我的waitForAcknowledgement方法总是等到超时
此外,我必须说,我对并行计算知之甚少,但我认为我们的java是单线程的,因此让java在matlab调用java函数时等待matlab代码完成可能是一个问题。但我不能肯定:]
如果您对如何以稳健的方式解决此问题有任何想法,将不胜感激。MATLAB的并行工具箱有何相关性?我看到的是纯java代码。因为我在回调处理函数中发现了关于利用matlab并行池的另一个主题的提示,但我不能这样做。matlab的并行工具箱有什么相关性?我看到的是纯java代码,因为我在回调处理函数中发现了另一个关于利用matlab的parallels池的主题的提示,但我不能这样做。
public class MatlabEvent {
private Vector<IMatlabListener> data = new Vector<IMatlabListener>();
private Vector<MatlabEventObject> matlabEvents = new Vector<MatlabEventObject>();
public void notifyMatlab(final Object obj, final MatlabAction action) {
final Vector<IMatlabListener> dataCopy;
matlabEvents.clear();
synchronized (this) {
dataCopy = new Vector<IMatlabListener>(data);
}
for (int i = 0; i < dataCopy.size(); i++) {
matlabEvents.add(new MatlabEventObject(this, obj, action));
((IMatlabListener) dataCopy.elementAt(i)).testEvent(matlabEvents.get(i));
}
}
public void onNotificationReceived() {
ExecutorService service = Executors.newSingleThreadExecutor();
long timeout = 15;
System.out.println("Executing runnable.");
Runnable r = new Runnable() {
@Override
public void run() {
waitForAcknowledgement(matlabEvents);
}
};
try {
Future<?> task = service.submit(r);
task.get(timeout, TimeUnit.SECONDS);
System.out.println("Notification acknowledged.");
} catch (Exception e) {
e.printStackTrace();
}
}
private void waitForAcknowledgement(final Vector<MatlabEventObject> matlabEvents) {
boolean allEventsAcknowledged = false;
while(!allEventsAcknowledged) {
allEventsAcknowledged = true;
for(MatlabEventObject eventObject : matlabEvents) {
if(!eventObject.isAcknowledged()) {
allEventsAcknowledged = false;
}
break;
}
}
}
}