我让我的 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;
}
}
是否有任何理由中断调用线程,或者这只是一个错误?
最佳答案
RemoteMatlabProxyFactory.getProxy()
方法创建了一个GetProxyRequestCallback
实例,然后 hibernate ,等待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;
}
}
}
关于java - 为什么 matlabcontrol 在代理创建时中断调用线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27402772/