java - 为什么 matlabcontrol 在代理创建时中断调用线程?

标签 java multithreading matlab matlabcontrol

我让我的 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/

相关文章:

java - 调用异步函数时自动显示 'loading' 指示符

java - 快速将复杂的json转换为java对象

c# - ZeroMQ PUB/SUB 模式与多线程轮询取消

c - 如何让线程按一定顺序执行?

MatLab 错误 : cannot open with static TLS

matlab - matlab中有双向映射吗?

java - 在我使用 Google Play 服务版本 9.0.83 进行的路线跟踪 Activity 中, map 上没有显示标记

java - 如何使用spring批处理在postgresql中执行存储过程?

Java - 运行方法中的 Thread.sleep

matlab - 如何将两个不同长度的向量相乘