How do I evaluate a matlab function from a separate java thread?

3 views (last 30 days)
There is a documentation for Matlab API for Java.
I tried to follow it but it seems not allowed if using multithread in java.
What is the point of allowing Java API or having a multi cpu computer???
Below is my source program that gives the following runtime error:
acquire sem: true evaluating: mytick_helper Exception in thread "Thread-20" java.lang.ExceptionInInitializerError at semwait$mythread.run(semwait.java:36) Caused by: java.lang.IllegalStateException: Initializing MATLAB Engine API from MATLAB is not supported. at com.mathworks.engine.MatlabEngine.<clinit>(MatlabEngine.java:75) ... 1 more
import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import com.mathworks.engine.*; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.logging.Logger;
public class semwait {
private class mythread extends Thread {
Semaphore m_sem;
String m_eval;
public mythread(Semaphore sem, String eval) {
m_sem = sem;
m_eval = eval;
}
@Override
public void run() {
boolean ret = false;
System.out.println("running semwait thread");
try {
ret = m_sem.tryAcquire(60, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
System.out.println("timeout: " + ex.getMessage());
}
System.out.println("acquire sem: " + ret);
if ((m_eval != null) && (m_eval != "")) {
System.out.println("evaluating: " + m_eval);
try {
// Execute command on shared MATLAB session
MatlabEngine eng = MatlabEngine.connectMatlab("darwin");
eng.eval("darwin=5;");
eng.eval("mytick_helper");
eng.close();
} catch (MatlabSyntaxException ex) {
Logger.getLogger(semwait.class.getName()).log(Level.SEVERE, null, ex);
} catch (CancellationException ex) {
Logger.getLogger(semwait.class.getName()).log(Level.SEVERE, null, ex);
} catch (ExecutionException ex) {
Logger.getLogger(semwait.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(semwait.class.getName()).log(Level.SEVERE, null, ex);
}
try {
} catch (Exception ex) {
System.out.println("exception: " + ex.getMessage() + ", str: " + ex.toString());
ex.printStackTrace();
}
System.out.println("done semwait thread.");
}
}
}
public void hello(String str) {
System.out.println("hello world: " + str);
}
public void hello() {
System.out.println("hello world");
}
public void wait(Semaphore sem, String eval_str) {
new mythread(sem, eval_str).start();
}
}

Accepted Answer

Darwin Te
Darwin Te on 15 Oct 2017
I have a work around for this problem by using timer object that polls the semaphore instead of using blocking and separate java thread from Matlab main thread. It is not the ideal solution but works for waiting a Matlab function to finish / return all data before my script continues other processing.

More Answers (0)

Categories

Find more on Startup and Shutdown in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!