欢迎访问欧博亚洲(Allbet Game)!

首页科技正文

晋城人才网:【杂谈】从实现角度看ChannelFuture,【杂谈】线程中止——Interrupt

admin2020-05-0252

JDK中的Future特征

在先容Netty的ChannelFuture之前,我们先来看看JDK中的Future是若何实现的。总的来说就是义务提交的时刻会使用装饰器模式,将义务包装成一个FutureTask。当执行器执行该Task的时刻,不仅仅会执行用户提交的义务,还会执行装饰器添加的分外操作,例如在执行之前纪录当前执行线程、执行完成后将义务效果保留在FutureTask工具内部等。

  • Thread runner   =>  装饰器添加的,在执行义务之前,会在工具内保留当前执行线程的引用,用于中止义务执行
  • Object outcome => 义务执行效果(返回值或异常工具),义务执行完成后会将效果set到此工具的outcome,后续可通过Future的get接口取出
  • Callable<V> callble => 用户提交的现实义务
  • WaitNode waiters => 用于保留守候线程,义务完成后会叫醒这些线程

详细请看本人已往整理的随笔:

  • 揭开Future的神秘面纱——义务作废
  • 揭开Future的神秘面纱——义务执行
  • 揭开Future的神秘面纱——效果获取

Netty中的ChannelFuture

ChannelFuture是在Future基础上的完善,它支持添加监听器,在义务完成后自动执行相关操作。

这个实在就是观察者模式,小我私家认为就是在前面的C部门添加监听的方式挪用,即执行线程执行完成后,若是发现该义务上有监听器,则该执行线程还会挪用监听器接口。

话不多说,我们来看看它代码到底是怎么写的,跟Future的实现有何异同。相关实现要害内容在DefaultPromise类中,相对于前面的FutureTask。

1.工具属性

 private volatile Object result;
 private final EventExecutor executor;
 private Object listeners;
 private short waiters;
 private boolean notifyingListeners;

从工具属性中我们可以得知,该工具没有保留用户义务。现实上小我私家义务这是它跟Future最大的差别,Future所引用的本质上是一个义务,而ChannelFuture所引用的只有义务状态和义务效果。以是这个DefaultPromise工具不会被作为义务提交到执行器中。

2.义务完成时的线程叫醒与监听器触发

private boolean setValue0(Object objResult) {
        if (RESULT_UPDATER.compareAndSet(this, null, objResult) ||
            RESULT_UPDATER.compareAndSet(this, UNCANCELLABLE, objResult)) {
            if (checkNotifyWaiters()) {
                notifyListeners();
            }
            return true;
        }
        return false;
    }

当义务执行完成,通过setValue将值传入DefaultPromise工具时,叫醒守候的线程,并触发监听器。

2.线程的守候与叫醒方式

public Promise<V> await() throws InterruptedException {
        if (isDone()) {
            return this;
        }

        if (Thread.interrupted()) {
            throw new InterruptedException(toString());
        }

        checkDeadLock();

        synchronized (this) {
            while (!isDone()) {
                incWaiters(); 
                try {
                    wait(); 
                } finally {
                    decWaiters();
                }
            }
        }
        return this;
    }
private synchronized boolean checkNotifyWaiters() {
    if (waiters > 0) {
        notifyAll();
    }
    return listeners != null;
}

从上述代码可知,这里的线程守候与叫醒方式使用的内置的wait()和notify()方式,而FutureTask的守候行列是单独实现的。

注:这里尚不清晰这两种实现方式之间的优劣。

3.设置监听器

public Promise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener) {
        checkNotNull(listener, "listener");

        synchronized (this) {
            addListener0(listener);
        }

        //添加监听器时,若是发现已经完成,则直接挪用触发监听器
        if (isDone()) {
            notifyListeners();
        }

        return this;
    }

若是义务已经完成,则直接触发监听器。防止泛起"挪用setLisener的时刻,义务已经完成,导致监听器不被触发"。

4.义务作废

public boolean cancel(boolean mayInterruptIfRunning) {
        if (RESULT_UPDATER.compareAndSet(this, null, CANCELLATION_CAUSE_HOLDER)) {
            if (checkNotifyWaiters()) {
                notifyListeners();
            }
            return true;
        }
        return false;
    }

从代码可以看出,它的实现与FutureTask有所差别,它并不会实验挪用执行线程的interrupt()方式来中止线程,只是将守候线程叫醒,并触发监听器。以是这个“作废”操作并不会影响代码的现实执行。

事实上“中止”也只是一种协作方式,它只是设置中止状态并将线程叫醒(若是该线程正处于挂起状态),若是用户代码中没有对中止状态举行判断,也没有使用wait()、sleep()等方式,中止操作也是不会现实“打断”代码执行的。

详细可看:【杂谈】线程中止——Interrupt

,

诚信在线手机版

诚信在线(现:阳光在线官网)现已开放诚信在线手机版、诚信在线电脑客户端下载。诚信在线娱乐游戏公平、公开、公正,用实力赢取信誉。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源:欧博亚洲(Allbet Game)!

本文链接:http://www.zbguandaobeng.com/post/1092.html

网友评论

最新评论

  • 欧博代理 10/15 说:

    欧博官网手机欢迎进入欧博官网手机(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。助力助力你

  • 欧博代理 10/15 说:

    欧博官网手机欢迎进入欧博官网手机(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。助力助力你

  • UG环球网址 10/15 说:

    AllbetGmaing电脑版下载欢迎进入AllbetGmaing电脑版下载(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。无意刷到,厉害了

  • Allbet电脑版下载 10/15 说:

    欧博开户欢迎进入欧博开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。大家一起评论

  • AllbetAPP下载 10/14 说:

    欧博注册欢迎进入欧博注册(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。谁看的有我多

  • 环球UG客户端下载 10/13 说:

    欧博开户欢迎进入欧博开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。脑洞大开的感觉

  • 欧博allbet客户端 10/12 说:

    欧博allbet网址欢迎进入欧博allbet网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。适合大众的读物

  • 欧博代理 10/11 说:

    联博www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。作者明白人