2014-12-10 11 views
7

Ho reso il mio thread di controllo Matlab interrompibile e ho scoperto che è stato interrotto per tutto il tempo alla prima esecuzione.Perché crea interrupt di matlabcontrol che chiamano thread su proxy?

Questo perché GetProxyRequestCallback ha interrompendo codice all'interno:

private static class GetProxyRequestCallback implements RequestCallback 
{ 
    private final Thread _requestingThread; 
    private volatile MatlabProxy _proxy; 

    public GetProxyRequestCallback() 
    { 
     _requestingThread = Thread.currentThread(); 
    } 

    @Override 
    public void proxyCreated(MatlabProxy proxy) 
    { 
     _proxy = proxy; 

     _requestingThread.interrupt(); 
    } 

    public MatlabProxy getProxy() 
    { 
     return _proxy; 
    } 
} 

ci siano motivi di interrompere chiamando filo o questo è solo un bug?

risposta

0

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; 
     } 
    } 
} 
Problemi correlati