Il metodo RemoteMatlabProxyFactory.getProxy()
crea un'istanza di GetProxyRequestCallback
e quindi dorme, in attesa che venga chiamato il metodo proxyCreated(...)
. Pertanto, se proxyCreated() non interrompe il thread che ha originariamente creato la richiesta, questo thread attenderà fino al raggiungimento del timeout.
A mio parere, questo è un difetto nella libreria matlabcontrol: Thread.interrupt() non deve essere abusato per questo scopo perché un thread interrotto può avere motivi diversi e non deve essere utilizzato per nulla tranne la segnalazione che il thread dovrebbe fermarsi.
Questo dovrebbe essere risolto nella libreria matlabcontrol in attesa invece di un mutex.
Ad esempio:
class RemoteMatlabProxyFactory implements ProxyFactory {
// [...]
@Override
public MatlabProxy getProxy() throws MatlabConnectionException {
GetProxyRequestCallback callback = new GetProxyRequestCallback();
Request request = this.requestProxy(callback);
return callback.getProxy(_options.getProxyTimeout());
}
// [...]
}
private static class GetProxyRequestCallback implements RequestCallback {
private final Object _lock = new Object();
private MatlabProxy _proxy;
@Override
public void proxyCreated(MatlabProxy proxy) {
_proxy = proxy;
_requestingThread.interrupt();
}
public MatlabProxy getProxy(long timeout) throws MatlabConnectionException {
synchronized (_lock) {
if (_proxy != null) {
return _proxy;
}
try {
_lock.wait(timeout);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new MatlabConnectionException("Thread was interrupted while waiting for MATLAB proxy", e);
}
if (_proxy == null) {
throw new MatlabConnectionException("MATLAB proxy could not be created in " + timeout + " milliseconds");
}
return _proxy;
}
}
}
fonte
2015-03-25 20:20:16