Matlab&;Java:异步执行matlab

Matlab&;Java:异步执行matlab,java,multithreading,matlab,asynchronous,synchronous,Java,Multithreading,Matlab,Asynchronous,Synchronous,所以,我今天的问题是: 首先,请注意,我没有可用的Matlab并行工具箱 我正在运行与Matlab交互的java代码。有时Matlab直接调用一些java函数,有时正好相反。在这种情况下,我们使用的通知系统如下: 然后,我们在适当的回调中处理通知 下面是一个简单的用例: 我的用户使用java界面选择一个配置文件,加载到Matlab中 使用接口侦听器,我们通知Matlab已选择配置文件,然后它运行一定数量的函数来分析该文件 分析完成后,它将被推送到java运行时,java运行时将用结果填充接口

所以,我今天的问题是:

首先,请注意,我没有可用的Matlab并行工具箱

我正在运行与Matlab交互的java代码。有时Matlab直接调用一些java函数,有时正好相反。在这种情况下,我们使用的通知系统如下:

然后,我们在适当的回调中处理通知

下面是一个简单的用例:

  • 我的用户使用java界面选择一个配置文件,加载到Matlab中
  • 使用接口侦听器,我们通知Matlab已选择配置文件,然后它运行一定数量的函数来分析该文件
  • 分析完成后,它将被推送到java运行时,java运行时将用结果填充接口表。这一步需要matlab调用java函数
  • 最后,java请求将接口切换到任意决定的选项卡
这是理想世界中事情发生的顺序,但是,下面是listener actionPerformed方法的代码:

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