美文网首页
阻塞、非阻塞、同步、异步

阻塞、非阻塞、同步、异步

作者: 想54256 | 来源:发表于2020-03-16 14:46 被阅读0次

这几个概念困扰了我好久,现在此做下总结:

阻塞:阻塞通常是指在一个执行过程中暂停,以等待某个条件的触发。(包括IO 阻塞、线程阻塞)

同步/异步:表示的发出调用后,被调用者是否立即返回。

阻塞/非阻塞:表示调用方线程是否在等待数据就绪(例如:Socket通道数据是否已读入内存)

以下图为例解释一下:其中读取数据分为2个步骤,1. 内核等待数据可读,2. 将内核读到的数据拷贝到进程,其中第一个步骤为阻塞的(因为他在等待数据就绪),而第二个步骤为非阻塞的。

描述的是从网卡读取UDP数据包的过程

这张图在第一个步骤中,应用进程不断的询问内核,当数据没有就绪时,内核会立即返回,此时调用放线程也并未阻塞着等待数据就绪,可以做其他事情,所以第一个步骤为“异步非阻塞”的。

而第二个步骤,应用进程开始系统调用copy数据到用户空间,此时这个调用没有立即返回,再结合上面的分析,所以这个步骤为“同步非阻塞的”。

在Java中实现同步阻塞调用、异步阻塞调用、异步非阻塞调用:

同步阻塞调用:

public class Test {

    public static void main(String[] args) throws InterruptedException {
        /* 同步阻塞调用: 
            调用没有立即返回 => 同步
            等待了数据就绪 => 阻塞
         */
        int result = func();
        func2(result);
    }
    
    public static int func() throws InterruptedException {
        // 模拟(IO)阻塞
        Thread.sleep(1000L);
        
        // 模拟计算操作
        return 1 + 1;
    }

    private static void func2(Integer result) {
        // do something...
    }
}
image

同步非阻塞演示不了

异步阻塞调用(此处使用join也能表现出来):

public class Test {

    public static void main(String[] args) throws Exception {
        /* 异步阻塞调用:
            调用后立即返回 => 异步
            返回后main线程直接获取结果,等待了数据就绪 => 阻塞
         */
        FutureTask<Integer> futureTask = new FutureTask<>(Test::func);
        new Thread(futureTask).run();

        Integer result = futureTask.get();
        func2(result);
    }

    private static int func() throws InterruptedException {
        // 模拟(IO)阻塞
        Thread.sleep(1000L);

        // 模拟计算操作
        return 1 + 1;
    }
    
    private static void func2(Integer result) {
        // do something...
    }

}
image

异步非阻塞调用:

public class Test {

    public static void main(String[] args) throws Exception {
        /* 异步非阻塞调用:
            调用后立即返回 => 异步
            调用后main线程直接就不管了,交由t1线程执行后续的操作,main线程也没有等待数据就绪 => 非阻塞
         */
        CompletableFuture.supplyAsync(() -> func())
                .thenAccept(result -> func2(result));
    }

    private static int func() {
        // 模拟(IO)阻塞
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 模拟计算操作
        return 1 + 1;
    }


    private static void func2(Integer result) {
        // do something...
    }

}
image

https://mp.weixin.qq.com/s/YzpC0BP3K5jEc7qlWtzBTw

相关文章

  • 谈论:同步异步阻塞非阻塞.md

    同步/异步:关注的方式(是否主动) 阻塞/非阻塞: 同步阻塞BIO: 同步非阻塞NIO: 异步非阻塞: 异步阻塞:

  • UNIX 的5种IO模型介绍

    IO模型同步、异步、阻塞、非阻塞socket阻塞与非阻塞,同步与异步 同步和异步 同步/异步主要针对C端-同步就像...

  • BIO NIO AIO

    BIO:同步阻塞IONIO:同步非阻塞IOAIO:异步非阻塞IO先弄清楚同步、异步,阻塞、非阻塞概念。 io操作分...

  • 阻塞非阻塞 同步异步 IO模型及其应用 NIO实现原理

    1.同步异步概念 2.阻塞非阻塞概念 3.常见I/O模型:同步阻塞IO,同步非阻塞IO,异步阻塞IO,异步非阻塞I...

  • IO模型

    原文参考链接 四种状态 同步 异步 阻塞 非阻塞 IO分类 同步阻塞IO 同步非阻塞IO 异步非阻塞IO注意: 没...

  • 阻塞,非阻塞,同步,异步

    阻塞,非阻塞,同步,异步

  • 同步、异步、阻塞、非阻塞,这下明白了

    同步阻塞,同步非阻塞,异步阻塞,异步非阻塞... 晕! 头! 转! 向! 对于小白来说,理解这些概念太难了。搜索这...

  • I/O模型

    一般来说I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO 同步阻塞IO:在此种方式下,用户进程在...

  • 并发、并行、同步、异步、阻塞、非阻塞

    并发 并行 同步 异步 阻塞 非阻塞

  • Java IO

    Before IO 分为:同步、异步阻塞、非阻塞 同步和异步是目的,阻塞和非阻塞是实现方式。 一个IO操作其实分成...

网友评论

      本文标题:阻塞、非阻塞、同步、异步

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