为啥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在代理创建时中断调用线程?的主要内容,如果未能解决你的问题,请参考以下文章