专注于快乐的事情

异步理论学习

概念介绍

阻塞/非阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。
vs同步,对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,不会阻塞当前线程,而会立刻返回。

同步/异步

同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回。
异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知调用方。

异步执行完成如何通知调用方?
回调/future/注册一个监听器
如果结果可以保存在一个公用的地方,可以采取,调用方主动轮询。

异步IO

高性能的标志:事件驱动、异步非阻塞。 例如:Nginx。

异步IO:我们都知道I/O和cpu计算是可以并行, IO是昂贵的。但我们的语言开发却是同步的IO。异步在操作系统层面是支持的。多线程通过信号量进行协助,消息等方式。
事件模型是异步的保证。

UNIX提供的几种IO/模型

1.阻塞I/O模型
2.非阻塞I/O模型(read轮询)
3.I/O复用模型(文件描述符select/poll—事件通知epoll)
4.信号驱动I/O模型(内核信号驱动开始I/O)
5.异步I/O模型(内核通知已经完成)-AIO

任何技术都不是完美的,非阻塞是需要轮询的,AIO只有linux有,不能利用系统缓存
NodeJs利用线程池实现AIO, Libuv自行实现线程池完成异步io

同步和异步的转换

利用java中future接口异步转为同步

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestFuture {

public static void main(String args[]) {
    System.out.println("start");
    ExecutorService es = Executors.newCachedThreadPool();
    Future<String> fu = es.submit(new Callable() {
        @Override
        public String call() throws Exception {
            mockExecute();
            return "hello world";
        }

    });
    System.out.println("hello world1");
    String result = "";
    try {
        System.out.println("hello world2");
        result = fu.get();
        System.out.println("hello world3");
        System.out.println("打印结果:" + result);
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
    es.shutdown(); // shutdown the executor
}

private static void mockExecute() throws InterruptedException {
    System.out.println("hello 开始执行");
    Thread.sleep(10000);
    System.out.println("hello 执行完成");
}

}

异步io的异步转为同步

其他参考网站

http://www.cnblogs.com/caolei1108/p/6210614.html

评论系统未开启,无法评论!