加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:34:14 所属栏目:Java 来源:网络整理
导读:我让我的Matlab控制线程可以中断,并发现它在第一次运行时一直被中断. 这是因为GetProxyRequestCallback内部有中断代码: private static class GetProxyRequestCallback implements RequestCallback{ private final Thread _requestingThread; private volat
我让我的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实例,然后休眠,等待调用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;
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读