2014-12-10 13 views
7

मैं अपने मैटलैब नियंत्रित धागा interruptable बना दिया है और पाया है कि यह पहली बार चलाने पर हर समय बाधित है।matlabcontrol प्रॉक्सी पर कॉलिंग थ्रेड को बाधित क्यों करता है?

इसका कारण यह है GetProxyRequestCallback अंदर कोड में दखल है:

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

वहाँ कोई कारण धागा बुला बाधित करने के लिए कर रहे हैं या यह सिर्फ एक बग है?

उत्तर

0

RemoteMatlabProxyFactory.getProxy() विधि GetProxyRequestCallback का एक उदाहरण बनाता है और फिर proxyCreated(...) विधि कहने के लिए प्रतीक्षा कर रहा है। इसलिए, अगर proxyCreated() ने मूल रूप से अनुरोध को बनाए गए थ्रेड को बाधित नहीं किया है, तो यह थ्रेड इंतजार करेगा जब तक कि टाइमआउट तक नहीं पहुंचेगा।

मेरी राय में, इस matlabcontrol पुस्तकालय में एक दोष है: Thread.interrupt() इस उद्देश्य के लिए दुरुपयोग नहीं किया जाना चाहिए, क्योंकि एक धागा विभिन्न कारणों से हो सकता है बाधित किया जा रहा है और संकेत धागा है कि के अलावा कुछ के लिए नहीं किया जाना चाहिए बंद कर देना चाहिए।

यह बजाय एक म्युटेक्स पर इंतजार द्वारा matlabcontrol पुस्तकालय में तय किया जाना चाहिए।

उदाहरण के लिए:

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; 
     } 
    } 
} 
संबंधित मुद्दे