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

조회 수: 3 (최근 30일)
Darwin Te
Darwin Te 2017년 10월 10일
답변: Darwin Te 2017년 10월 15일
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();
}
}

채택된 답변

Darwin Te
Darwin Te 2017년 10월 15일
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.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Startup and Shutdown에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by