【问题标题】:Why does matlabcontrol interrupt calling thread upon proxy create?为什么matlabcontrol在代理创建时中断调用线程?
【发布时间】:2015-02-08 18:02:25
【问题描述】:

我让我的 Matlab 控制线程可中断,发现它在第一次运行时一直被中断。

这是因为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;
    }
}

是否有任何理由中断调用线程或者这只是一个错误?

【问题讨论】:

    标签: java multithreading matlab matlabcontrol


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多