Java异步I/O编程实现的两种方式:将来式和回调式

2023-10-29

package org.zwc.test;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.channels.CompletionHandler;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

/**
 * Created by zhangwenchao on 2017/12/28.
 * 异步IO通道有三种:AsynchronousFileChannel  AsynchronousSocketChannel  AsynchronousServerSocketChannel  
 * 下面以异步I/O 文件通道实现两种方式:将来式和回调式(其他异步通道类似)
 * 1、将来式:主线程发起I/O操作,主线程在读取数据过程继续完成别的事情,之后通过轮询等待结果完成。
 * 2、回调式:采用事件处理机制
 */
public class Test9 {

    public static void main(String[] args) {

        futureManner();

        callbackManner();
    }


    /**
     * 将来式
     */
    public static  void futureManner(){
        try {
            Path file = Paths.get("E:/data/logs/webApp.log");

            AsynchronousFileChannel channel =  AsynchronousFileChannel.open(file, StandardOpenOption.READ,StandardOpenOption.WRITE);

            ByteBuffer byteBuffer = ByteBuffer.allocate(100_000);  //缓冲区大小

            /**
             * 从channel中读取数据到缓冲区
             */
            Future<Integer> result = channel.read(byteBuffer, 0);
            while(!result.isDone()){
                System.out.println("主线程不阻塞,可以干别的事....");

            }
            Integer byteReadNum = result.get();
            System.out.println("读取数据完毕:"+byteReadNum);



            byteBuffer.flip(); //从Buffer读出数据前调用

            /**
             * 将缓冲区数据写入通道
             */
            Future<Integer> writeNum = channel.write(byteBuffer, channel.size());
            while(!writeNum.isDone()){
                System.out.println("主线程不阻塞,可以干别的事....");
            }
            channel.close();
            System.out.println("写入数据完毕:"+writeNum.get());
        } catch (IOException|InterruptedException|ExecutionException e) {
            e.printStackTrace();
        }
    }


    /**
     * 回调式
     */
    public static void callbackManner(){

        try {
            Path file = Paths.get("E:/data/logs/webApp.log");
            AsynchronousFileChannel channel =  AsynchronousFileChannel.open(file, StandardOpenOption.READ,StandardOpenOption.WRITE);
            ByteBuffer byteBuffer = ByteBuffer.allocate(100_000);  //缓冲区大小


            channel.read(byteBuffer, 0, byteBuffer, new CompletionHandler<Integer, ByteBuffer>() {
                @Override
                public void completed(Integer result, ByteBuffer attachment) {
                    System.out.println("读取数据完成:"+result);

                }

                @Override
                public void failed(Throwable exc, ByteBuffer attachment) {
                    exc.printStackTrace();
                }
            });


            try {
                System.out.println("主线程休眠3秒或者处理别的事情,等待IO完成");
                Thread.sleep(3000);  //zhu
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("主线程退出");

        } catch (IOException e) {
            e.printStackTrace();
        }





    }



}


执行结果:

将来式:

主线程不阻塞,可以干别的事....
主线程不阻塞,可以干别的事....
主线程不阻塞,可以干别的事....
主线程不阻塞,可以干别的事....
读取数据完毕:14760
主线程不阻塞,可以干别的事....
主线程不阻塞,可以干别的事....
写入数据完毕:14760

回调式:
主线程休眠3秒或者处理别的事情,等待IO完成
读取数据完成:29520
主线程退出


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java异步I/O编程实现的两种方式:将来式和回调式 的相关文章

  • 在Python中修改大型文本文件最后一行的最有效方法

    我需要更新几个超过 2GB 的文件的最后一行 这些文件由无法读取的文本行组成readlines 目前 它可以通过逐行循环来正常工作 但是 我想知道是否有任何编译库可以更有效地实现这一点 谢谢 目前的方法 myfile open large
  • 常规文件读取可以从非阻塞 IO 中受益吗?

    对我来说似乎不是 我找到了一个支持我的观点的链接 http www remlab net op nonblock shtml 你怎么认为 您发布的链接内容是正确的 以非阻塞模式打开的常规文件套接字将始终 准备好 读取 当您实际尝试读取它时
  • 如何通过pthreads管理两个或多个消费者?

    我有一个正在寻求解决的通用问题 即从标准输入或常规文件流发送到应用程序的二进制数据块 应用程序又将二进制数据转换为文本 使用线程 我想在将文本传输到下一个应用程序之前对其进行处理 该应用程序会进一步修改该文本 依此类推 作为一个简单的测试用
  • Python:数百万个小文件的读写速度缓慢

    结论 看来 HDF5 是适合我的目的的方法 基本上 HDF5 是一种用于存储和管理数据的数据模型 库和文件格式 并且旨在处理令人难以置信的大量数据 它有一个名为 python tables 的 Python 模块 链接在下面的答案中 HDF
  • 如何从标准输入读取一行,阻塞直到找到换行符?

    我试图从命令行的标准输入一次读取任意长度的一行 我不确定是否能够包含 GNU readline 并且更喜欢使用库函数 我读过的文档表明getline应该可以工作 但在我的实验中它不会阻塞 我的示例程序 include
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • Java - 了解 PrintWriter 和刷新的需要

    好吧 首先我对所有代码表示歉意 但我觉得代码太多总比代码不够好 我正在制作一个简单的聊天客户端和印刷机 尤其是我正在努力解决的问题 使用现在的代码 它将与服务器类交互 并且完美地打印我想要打印的内容 但是 当我删除 writer flush
  • 为什么我需要一块一块地读取文件来缓冲?

    我看到了以下用于将文件放入数组的代码 该数组又用作将其插入 blob 列的 SQL 命令的参数 using FileStream fs new FileStream soubor FileMode Open FileAccess Read
  • golang中如何将相对路径解析为绝对路径?

    节点中是否有类似 path resolve 的API 或者有什么东西可以做同样的事情 例如 nodejs代码 path resolve sample sh 应该得到 home currentuser sample sh 解决 表示用户主目录
  • 快速写入:内存映射文件与 BufferedWriter

    有人对此进行过基准测试吗 我希望尽可能快地写入磁盘 最大限度地减少写入调用的延迟 我想知道写入内存映射缓冲区 通过 buffer put 是否比仅在 Java 端缓冲内容并在缓冲区满后刷新到 fileChannel 更快 这样 一旦缓冲区已
  • 如何在 python 中更新/修改 XML 文件?

    我有一个 XML 文档 我想在它包含数据后对其进行更新 我考虑过打开 XML 文件 a 追加 模式 问题是新数据将写入根结束标记之后 如何删除文件的最后一行 然后从该点开始写入数据 然后关闭根标签 当然 我可以读取整个文件并进行一些字符串操
  • 我什么时候应该使用 file.read() 或 file.readlines() ?

    我注意到 如果我迭代打开的文件 则迭代它的速度要快得多 而无需read首先 那是 l open file r for line in l 比 l open file r for line in l read or l open file r
  • C# 写入文件的性能

    我的情况概述 我的任务是从文件中读取字符串 并将它们重新格式化为更有用的格式 重新格式化输入后 我必须将其写入输出文件 这是必须完成的操作的示例 文件行示例 ANO 2010 CPF 17834368168 YEARS 2010 2009
  • 如何使用用户输入变量作为通用包的参数?

    In Stack adb我指定了两个参数 大小和类型 我想创建一个堆栈 该堆栈的数据类型与用户在我的堆栈中指定的数据类型完全相同multistack adb file 我似乎找不到一种方法来创建新的包或使用用户定义的堆栈类型变量来实例化堆栈
  • 什么是输入流和输出流?我们为什么以及何时使用它们?

    有人向我解释一下什么InputStream and OutputStream are 我对两者的用例感到困惑InputStream and OutputStream 如果您还可以包含一段代码来配合您的解释 那就太好了 谢谢 目标是Input
  • 从流中获取文本阅读器?

    我正在尝试读取嵌入的文本文件System Reflection Assembly GetExecutingAssembly GetManifestResourceStream resource 但它给了我一个Stream 嵌入的资源是一个文
  • golang中的Reader接口和Read方法

    我正在关注 golang 之旅 我被要求 实现一个 rot13Reader 它实现 io Reader 并从 io Reader 读取 通过将 ROT13 替换密码应用于所有字母字符来修改流 我首先将方法实现到 rot13Reader ty
  • 在文本文件中的特定位置添加新行。

    我正在尝试在文件中添加特定的文本行 特别是在两个边界之间 如果我想在 item1 的边界之间添加一条线 它会是什么样子 item1 2550 coins 995 200000 7 2550 coins 995 200000 7 2550 c

随机推荐

  • 你一定要知道的那些以太坊术语解释

    block 区块 包含交易 0或多个 父区块 parent hash及其他数据的数据包 在区块链中 除创世区块的每个区块都要包含其父区块的hash 整个区块链包含一个网络的所有交易历史 注意 有些基于区块链的加密货币自称 账本 而非 区块链
  • HashMap底层原理分析

    HashMap的实现原理在Jdk1 7之前底层实现是基于数组 链表的形式 即通过HashMap的key值进行Hash 然后对容量 默认16 负载因子 默认是0 75 进行取余获取到其桶的位置 比如某一个key的hash值是18 容量为为16
  • C语言if语句,for循环相关年月日应用

    文章目录 一 if双分支语句变成单分支语句 1 if单分支语句 2 if双分支语句 3 if双分支语句改成单分支语句 二 采用冒泡排序法对n个数据排序 编写n个元素数组 用冒泡排序法进行排序 三 输入一个年份 判断是不是闰年 1 满足两个条
  • 俞敏洪演讲:创业不需要有钱 只需想着挣钱

    各位朋友大家下午好 上午我坐下面我发现我跟郭凡生郭总很大不同 他认为他自己很聪明 而我恰恰认为自己不聪明 我呢认为自己也不一定笨 他认为他很有吸引力 确实是对三四十岁的中年人来说 郭总很有创业热情 因为这个年龄的人 能够用那样的语气语调 两
  • RabbitMQ(八)【高级 - 过期时间 TTL】

    八 RabbitMQ高级 过期时间 TTL 上一篇文章 SpringBoot案例 概述 过期时间 TTL 表示可以对消息设置预期的时间 在这个时间内都可以被消费者接收获取 过了之后消息将自动被删除 RabbitMQ可以对 消息和队列 设置
  • 技术博客?

    我认为技术博客是一个非常好的工具 能够帮助我们更好地学习和理解各种技术 同时还能够帮助我们建立自己的品牌和声誉 在我的博客中 我会分享各种最新的技术 开发工具 以及一些我在实际项目中的经验和教训 我的博客主题主要分为以下几个方面 1 前端开
  • 如何高效解决问题?

    前言 我相信很多人在生活中和工作中都会遇到大大小小的问题 每个人解决问题的效率和思维都是有差别的 那么怎么样才能高效解决问题呢 其实问题的产生 从现象到逻辑 考验着我们的知识储备 磨砺着能力的段位 训练着思维的灵活度 从现象到方法论 5W1
  • Elasticsearch学习系列之term和match查询 Elasticsearch查询模式

    Elasticsearch查询模式 一种是像传递URL参数一样去传递查询语句 被称为简单查询 GET library books search 查询index为library type为books的全部内容 GET library book
  • Bean的自动装配 Spring使用注解开发

    Bean的自动装配 自动装配是Spring满足bean依赖的一种方式 Spring会在上下文自动寻找 并自动给bean装配 1 在xml中显示的配置 2 在java中显示的配置 3 隐式 的自动装配bean 重要 测试 autowire b
  • GPT-3 模型

    GPT 3 Generative Pre training Transformer 3 是由 OpenAI 开发的一种大型语言生成模型 它可以用来进行文本生成 翻译 问答等任务 GPT 3 使用了 Transformer 架构 并在大量的网
  • day14-多线程01

    1 实现多线程 1 1简单了解多线程 理解 是指从软件或者硬件上实现多个线程并发执行的技术 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程 提升性能 1 2并发和并行 理解 并行 在同一时刻 有多个指令在多个CPU上同时执行
  • [4G/5G/6G专题基础-160]: BLER与MCS的关系、MCS表格的选择

    目录 第1章 什么是MCS 1 1 基本概念 1 2 三张不同的MCS表 1 3 MCS表的选择 1 4 MCS index的选择 第2章 什么是BLER 2 1 什么是比特误码率BER 2 2 什么是BLER 第3章 BLER与MCS的关
  • 机器学习——建筑能源得分预测

    前言 编码之前是了解我们试图解决的问题和可用的数据 在这个项目中 我们将使用公共可用的纽约市的建筑能源数据 目标是使用能源数据建立一个模型 来预测建筑物的Enerqy Star Score 能源之星分数 并解释结果以找出影响评分的因素 数据
  • 运维必学

    欢迎关注 全栈工程师修炼指南 专注 企业运维实践 网络安全 系统运维 应用开发 物联网实战 全栈文章 等知识分享 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 作者主页 https www weiyigeek top 博客
  • 猫狗大战 python_猫狗大战

    这个项目我们要做一个识别猫狗的模型 这和上次的数字识别一样 也是运用深度学习 不过这次模型较为复杂 我们会用到迁移学习 站在巨人的肩膀上 借用大佬们已经训练好的模型来搭建我们自己的模型并让它做我们想做的事 安装要求Python3 Numpy
  • python深浅拷贝

    转自 https zhuanlan zhihu com p 258097244 只为记录 侵删 在讲深浅拷贝之前 想先讲一下 is 和 的区别 在进行对象是否相等比较的时候我们可以用 is 和 is 比较两个对象的引用是否相同 即 它们的i
  • 微信小程序模拟车位选择功能(简陋版本)

    功能 实现在线选车位功能 效果图 js文件 const app getApp Page data indicatorDots false autoplay false interval 5000 duration 1000 items va
  • SpringBoot笔记:Log配置和性能比较小结

    文章目录 1 Log的作用 2 Log4j 2 1 简介 2 2 Loggers 2 3 Appenders 2 4 Layouts 2 5 Log4j配置文件示例 3 Log4j2 3 1 Log4j2配置文件示例 4 Logback 4
  • 【终结扩散模型】Consistency Models.OpenAI开源新模型代码,一步成图,1秒18张

    终结扩散模型 Consistency Models OpenAI开源新模型代码 一步成图 1秒18张 0 前言 Abstract 1 Introduction 2 Diffusion Models 3 Consistency Models
  • Java异步I/O编程实现的两种方式:将来式和回调式

    package org zwc test import java io IOException import java nio ByteBuffer import java nio channels AsynchronousFileChan