美文网首页
【Netty零基础学习】-异步机制

【Netty零基础学习】-异步机制

作者: 文竹小二 | 来源:发表于2018-05-05 20:59 被阅读39次

    理解异步

    用实际场景来理解异步。
    场景一: 餐厅就餐(人物:小张和服务员)
    同步:小张点完餐后把单子交给服务员,之后就不停询问服务员饭菜是否已被准备好。如果准备好了,就自己去端饭菜;如果没准备好,就过一会再询问。
    异步:小张点完餐后把单子交给服务员,后续就坐等服务员把饭菜主动端到餐桌上。中途可以看看手机打发时间。
    对比同步或异步,异步明显给小张的用户体验更好。

    场景二:Netty ChannelFuture
    以服务端启动来说,启动过程中主线程会生成一个RegisterChannelFuture,主线程第一次提交任务(任务会引用RegisterChannelFuture)到NioEventLoop时会启动NioEventLoop线程并返回。主线程然后再往RegisterChannelFuture注册listener回掉函数。当任务在NioEventLoop线程中执行完后,会主动调用RegisterChannelFuture中的listener回掉函数。

    对于此场景,当主线程注册完listener回掉函数后,就可以继续做其他事情。

    异步实例

    import java.util.ArrayList;
    
    public class Main {
    
        public static void main(String[] args){
            final Future future = new Future();
            Thread thread = new Thread(()->{
                try{
                    Thread.sleep(10000);
                } catch (Exception e){
                }
                future.setSuccess();
            });
            thread.start();
    
            future.addListener(()->{
                System.out.println("async call successfully.");
            });
        }
    
        private static class Future {
            private volatile int status;
            private ArrayList<Listener> listeners;
    
            public Future() {
                status = 0;
                listeners = new ArrayList<>();
            }
    
            public int getStatus() {
                return status;
            }
    
            public void setStatus(int status) {
                this.status = status;
            }
    
            public void setSuccess() {
                setStatus(1);
    
                // notify listeners.
                for(Listener listener : listeners) {
                    listener.onCompleted();
                }
            }
    
            public void addListener(Listener listener){
                listeners.add(listener);
            }
        }
    
        interface Listener{
         void onCompleted();
        }
    }
    

    说明:
    主线程中创建了一个Future实例并创建和启动了一个新线程(新线程可以调用future实例),之后主线程引用了注册了一个listener回掉函数。这里例子能实现异步的一个关键点在于有一个future共享变量,在JVM创建thread对象后,此变量作为thread.run方法的形参传入,所以新线程能访问future变量(如下图标红字节码部分)。

    image.png

    相关文章

      网友评论

          本文标题:【Netty零基础学习】-异步机制

          本文链接:https://www.haomeiwen.com/subject/uxverftx.html