zoukankan      html  css  js  c++  java
  • Java同步和异步,阻塞和非阻塞

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

    同步和异步关注的是消息通信机制.

    同步是指: 发送方发出数据后, 等待接收方发回响应后才发下一个数据包的通讯方式. 就是在发出一个调用时, 在没有得到结果之前, 该调用就不返回, 但是一旦调用返回, 就得到返回值了. 也就是由"调用者"主动等待这个"调用"的结果.

    异步是指: 发送方发出数据后, 不等待接收方发回响应, 接着发送下个数据包的通讯方式. 当一个异步过程调用发出后, 调用者不会立刻得到结果. 而是在调用发出后, "被调用者"通过状态、通知来通知调用者, 或通过回调函数处理这个调用.

    阻塞和非阻塞属于进程API执行动作的方式, 关注的是程序在等待调用结果时的状态.

    阻塞是指: 调用结果返回之前, 当前线程会被挂起. 函数只有在得到结果之后才会返回, 线程需要等待结果.

    非阻塞是指: 与阻塞的概念相对应, 指在不能立刻得到结果之前, 该函数不会阻塞当前线程, 而会立刻返回. 线程不需要等待结果.

    Java中的同步和异步

    定义: 任务A, 任务B

    同步: 任务A和任务B之间有关联, 例如任务B中途要给任务A一个数字, 那么任务A或许需要等待任务B生产这个数, 任务A需要等待任务B的这个动作叫做同步.

    异步: 事件A和事件B之间没有关联, 是相互独立的, 那么相互都不用管对方干了什么.

    定义: 线程A和线程B, 分别在执行任务A和任务B

    阻塞: 线程A需要等待线程B, 于是线程A在等待这个数的步骤上被挂起, 不能分到cpu, 不能执行, 这样被称为阻塞.

    非阻塞: 线程同样需要线程B给一个数, 但是线程A仅仅告知线程B要给这个数, 并没有马上就要使用这个数, 此时线程A没有被挂起, 仍然能分到cpu, 仍然能执行, 这样被称为非阻塞.

    下面给出Java代码的例子.

    同步阻塞:

    int i = System.in.read();

    当命令终端没有输入时, 调用该方法的线程被阻塞 ,表现出和终端同步.

    异步非阻塞:

    Future<T> future = threadPool.submit(Callable<T> callable);
    // doSomething
    future.get();

    callable内的任务结果没有马上需要的必要, 于是调用submit()方法马上返回一个实现Future的存根. callable任务对于当前线程是异步的, 不需要阻塞当前线程.

    但是到左后县城需要callable任务的结果时, 就需要同步了, get()方法通过阻塞来实现.

    同步非阻塞:

    concurrentLinkedQueue.offer((T) t);

    该过程一个元素需要入队列, 该并发队列为了让当前线程不阻塞而又能正确入队, 使用CAS算法实现的乐观锁循环尝试入队. offer()方法并没有阻塞当前线程, 而又希望同步, 于是通过循环来实现, 最终实现同步非阻塞.

    异步阻塞:

    没有例子. 阻塞就是用来实现同步的,这和同步阻塞有什么区别, 那实现它还有什么用呢?

  • 相关阅读:
    Programming Windows 第五版读书笔记 第三章 窗口和消息
    一个带游标的遍历数据的函数|数据库操作|软件开发
    递归删除一个文件夹下的所有文件c#代码
    杭州市市民卡办理点
    NTLDR is missing 的解决方法
    SQL Server中 将日期格式化.函数 CONVERT
    1.显示网页中的所有图片
    用sql函数获取中文字符串的全拼
    地柜便利一个文件夹下的所有文件|软件开发
    软件是什么
  • 原文地址:https://www.cnblogs.com/hujingnb/p/11708872.html
Copyright © 2011-2022 走看看