为啥matlabcontrol在代理创建时中断调用线程?

Posted

技术标签:

【中文标题】为啥matlabcontrol在代理创建时中断调用线程?【英文标题】: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;
    

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

【问题讨论】:

【参考方案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;
        
    

【讨论】:

以上是关于为啥matlabcontrol在代理创建时中断调用线程?的主要内容,如果未能解决你的问题,请参考以下文章

在代码执行进入 Dll 或 Lib 空间时中断

如何在用户输入时中断 ocaml 程序

Eclipse - 在 Android 应用程序上引发未处理的异常时中断用户代码

ACF 页面 while 循环在循环时中断页脚

抛出异常时中断

flink:在等待数据被管道确认时中断