Java中的异步非阻塞I/O操作

Java中的异步非阻塞I/O操作

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下Java中的异步非阻塞I/O操作。

一、异步非阻塞I/O简介

异步非阻塞I/O(Asynchronous Non-Blocking I/O)是指在执行I/O操作时,不会阻塞线程。传统的阻塞I/O操作会让线程等待I/O操作完成,而异步非阻塞I/O则允许线程在等待I/O操作完成期间继续执行其他任务。

在Java中,异步非阻塞I/O主要通过java.nio包提供的NIO(New I/O)和java.nio.channels包提供的Channels来实现。此外,Java 7引入了NIO.2(Asynchronous I/O)的增强,进一步提升了异步I/O操作的能力。

二、NIO的基本概念

NIO的核心组件包括:

  1. Channels:通道类似于流,可以读写数据。
  2. Buffers:缓冲区用于存储从通道读写的数据。
  3. Selectors:选择器用于监听多个通道的事件,如连接请求、数据到达等。

三、使用Channels和Buffers

下面是一个简单的示例,展示了如何使用Channels和Buffers进行非阻塞I/O操作:

package cn.juwatech.demo.nio;import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;public class NioExample {public static void main(String[] args) {Path path = Path.of("example.txt");// 写数据到文件try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {ByteBuffer buffer = ByteBuffer.allocate(1024);buffer.put("Hello, NIO!".getBytes());buffer.flip();fileChannel.write(buffer);} catch (IOException e) {e.printStackTrace();}// 读数据从文件try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) {ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = fileChannel.read(buffer);while (bytesRead != -1) {buffer.flip();while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}buffer.clear();bytesRead = fileChannel.read(buffer);}} catch (IOException e) {e.printStackTrace();}}
}

四、使用Selectors

Selectors允许我们一个线程管理多个通道,以下是一个使用Selector的例子:

package cn.juwatech.demo.nio;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;public class SelectorExample {public static void main(String[] args) {try (Selector selector = Selector.open();ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {serverSocketChannel.bind(new InetSocketAddress(8080));serverSocketChannel.configureBlocking(false);serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select();Iterator<SelectionKey> keys = selector.selectedKeys().iterator();while (keys.hasNext()) {SelectionKey key = keys.next();keys.remove();if (key.isAcceptable()) {handleAccept(key);} else if (key.isReadable()) {handleRead(key);}}}} catch (IOException e) {e.printStackTrace();}}private static void handleAccept(SelectionKey key) throws IOException {ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();SocketChannel socketChannel = serverChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(key.selector(), SelectionKey.OP_READ);}private static void handleRead(SelectionKey key) throws IOException {SocketChannel socketChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = socketChannel.read(buffer);if (bytesRead == -1) {socketChannel.close();} else {buffer.flip();socketChannel.write(buffer);buffer.clear();}}
}

五、使用NIO.2的异步I/O

Java 7引入了NIO.2,通过AsynchronousFileChannel提供了更强大的异步文件I/O操作:

package cn.juwatech.demo.nio2;import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.concurrent.Future;public class AsyncFileChannelExample {public static void main(String[] args) {Path path = Path.of("async_example.txt");// 异步写文件try (AsynchronousFileChannel asyncFileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {ByteBuffer buffer = ByteBuffer.allocate(1024);buffer.put("Hello, Async NIO!".getBytes());buffer.flip();Future<Integer> result = asyncFileChannel.write(buffer, 0);while (!result.isDone()) {System.out.println("Writing...");}System.out.println("Write done: " + result.get());} catch (IOException | InterruptedException | ExecutionException e) {e.printStackTrace();}// 异步读文件try (AsynchronousFileChannel asyncFileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ)) {ByteBuffer buffer = ByteBuffer.allocate(1024);Future<Integer> result = asyncFileChannel.read(buffer, 0);while (!result.isDone()) {System.out.println("Reading...");}System.out.println("Read done: " + result.get());buffer.flip();while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}} catch (IOException | InterruptedException | ExecutionException e) {e.printStackTrace();}}
}

六、总结

通过以上示例,我们展示了如何在Java中使用NIO和NIO.2进行异步非阻塞I/O操作。NIO提供了强大的工具来处理高效的I/O操作,尤其是在高并发环境下,能够显著提升系统的性能和响应能力。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/49859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7-25学习笔记

一、锁对象 Lock接口 1、创建锁对象 ReentrantLock类 Lock locknew ReentrantLock(true); 默认创建的是非公平锁 在创建锁对象时传入一个true参数 便会创建公平锁 先来后到 是重入锁 排他锁 加锁后不允许其它线程进入 2、加锁、解锁 &#xff08;1&#xff09;loc…

OWASP ZAP:一款功能强大的开源Web安全扫描工具

目录 介绍 安装和配置 下载和安装 启动和配置 主界面概述 基本功能 自动扫描 手动测试 被动扫描 主动扫描 高级功能 代理功能 Fuzzer API 插件和扩展 使用场景 开发阶段 测试阶段 生产环境 实践案例 案例一&#xff1a;自动化扫描 案例二&#xff1a;手动…

Redis-数据的极速之旅(一)

Redis基础篇 Redis的自我介绍我的核心数据结构1.字符串&#xff08;String&#xff09;2.哈希&#xff08;Hash&#xff09;3.列表&#xff08;List&#xff09;4.集合&#xff08;Set&#xff09;5.有序集合&#xff08;Sorted Set&#xff09; 高性能原理1.Redis为什么快&…

B端系统UI个性化设计:感受定制之美

B端系统UI个性化设计&#xff1a;感受定制之美 引言 艾斯视觉作为ui设计和前端开发从业者&#xff0c;其观点始终认为&#xff1a;在当今竞争激烈的商业环境中&#xff0c;B端&#xff08;Business-to-Business&#xff09;系统的设计不再仅仅是功能性的堆砌&#xff0c;而是…

在线工具(网站)

1. 网站漏洞扫描程序 网站漏洞扫描程序是一种高度准确的漏洞扫描解决方案&#xff0c;经过了实际渗透测试的考验。快速检测 XSS、SQL 注入、命令注入、XXE 和其他关键问题 — 自动验证以消除误报。 https://pentest-tools.com/website-vulnerability-scanning/website-scanne…

ChatGPT建议前端学习计划

HTML&CSS基础 - 学习HTML标签、CSS属性、页面布局等基础知识 JavaScript基础 - 学习变量、数据类型、控制流、函数等基础知识 jQuery - 学习如何使用jQuery处理文档对象模型&#xff08;DOM&#xff09;、事件、动画等 Ajax - 全称为 Asynchronous JavaScript and XML&…

【sklearn实战】datasets数据集简介

一 sklearn.datasets数据集 sklearn.datasets 中主要包含了4类数据集。 1.1 Toy datasets&#xff08;玩具数据集&#xff09; scikit-learn 内置的一些小型标准数据集&#xff0c;不需要从某个外部网站下载任何文件&#xff0c;用datasets.load_xx()加载。比如&#xff1a;…

AJAX(1)

什么是AJAX? AJAX是异步的JavaScript和XML。简单来说&#xff0c;就是使用XMLHttpRequest对象与服务器通信。它可以使用JSON,XML,HTML和text文本等格式发送和接收数据。AJAX最吸引人的就是它异步的特性&#xff0c;也就是说它可以在不重新刷新页面的情况下与服务器通信&#…

打包团队,招机器视觉工程师整个团队,缺陷检测经验更佳,BOSS半导体大厂背景,不愁订单,现精耕于半导体,PCB,PCBA视觉检测

打包团队&#xff0c;招机器视觉工程师整个团队&#xff0c;缺陷检测经验更佳&#xff0c;BOSS半导体大厂背景&#xff0c;不愁订单&#xff0c;现精耕于半导体&#xff0c;PCB&#xff0c;PCBA视觉检测 视觉人机器视觉 视觉人机器视觉教学 2024年07月28日 00:21 江苏 苏州大视…

C#:通用方法总结—第6集

大家好&#xff0c;今天继续介绍我们的通用方法系列。 下面是今天要介绍的通用方法&#xff1a; &#xff08;1&#xff09;这个通用方法为SW查找草图数量 /// <summary> /// 查找草图数量 /// </summary> /// <param name"doc2"></param>…

书生大模型实战营--L1关卡-OpenCompass 评测 InternLM-1.8B 实践

一、使用 OpenCompass 评测 internlm2-chat-1.8b 模型在 MMLU 数据集上的性能 1、使用lmdeploy部署 internlm2-chat-1.8b模型 2、根据OpenCompass官网教程安装并下载数据集 opencompass/README_zh-CN.md at main open-compass/opencompass GitHub 注意&#xff1a; pyhton…

JAVAWeb实战(前端篇)

项目实战一 0.项目结构 1.创建vue3项目&#xff0c;并导入所需的依赖 npm install vue-router npm install axios npm install pinia npm install vue 2.定义路由&#xff0c;axios&#xff0c;pinia相关的对象 文件&#xff08;.js&#xff09; 2.1路由(.js) import {cre…

当全球银行系统“崩溃”时会发生什么?

有句名言&#xff1a;“当美国打喷嚏时&#xff0c;世界就会感冒……”换句话说&#xff0c;当人们对美国及其经济稳定性的信心下降时&#xff0c;其他经济体&#xff08;以及黄金、白银和股票等资产&#xff09;的价值往往会下降。 与任何其他资产类别一样&#xff0c;加密货…

超详细-数据结构-二叉树概念及结构,堆的概念及结构以及堆的代码的c语言实现

本篇博客将详细讲述二叉树的概念&#xff0c;堆的概念及结构以及堆的代码实现&#xff0c;以及二叉树&#xff0c;堆的相关应用。Top K 问题&#xff0c;堆排序的实现以及二叉树链式结构的实现将在之后的博客更新。你可在目录中找到你想重点阅读的内容。堆的完整代码实现在文章…

如何撤销/回滚远程修改

1. git revert 通过git revert commit_id&#xff0c;撤销指定commit&#xff0c;然后push到远程分支&#xff0c;即可撤销指定commit的修改&#xff0c;并新增一个revert的提交记录。 2. 撤销HEAD的修改并删除提交记录 git reset --hard HEAD^ # 撤销最近一次的修改 git pu…

【秋招笔试题】方程

解析&#xff1a;暴力枚举。建议用Python的eval函数,C手写略麻烦。 #include <iostream> #include <string> #include <vector> #include <sstream>using namespace std;long long stringResult(const string &expr) {vector<string> plusP…

文字改视频技术——Rerender A Video

Rerender A Video 的实现技术结合了深度学习、计算机视觉、图像处理、GPU 加速和云计算等多种先进技术&#xff0c;旨在提供高效、优质的视频渲染和增强功能。以下是详细说明&#xff0c;特别突出风格迁移技术的解释。 一、Rerender A Video 介绍 Rerender A Video 利用深度学…

visual studio性能探测器使用案列

visual studio性能探测器使用案列 在visual studio中&#xff0c;我们可以使用自带的工具对项目进行性能探测&#xff0c;具体如下 1.选择性能探查器 Vs2022/Vs2019中打开方式&#xff1a; Vs2017打开方式&#xff1a; 注意最好将解决方案配置为&#xff1a;Release Debu…

昇思25天学习打卡营第22天|CycleGAN图像风格迁移互换

相关知识 CycleGAN 循环生成网络&#xff0c;实现了在没有配对示例的情况下将图像从源域X转换到目标域Y的方法&#xff0c;应用于域迁移&#xff0c;也就是图像风格迁移。上章介绍了可以完成图像翻译任务的Pix2Pix&#xff0c;但是Pix2Pix的数据必须是成对的。CycleGAN中只需…

如何获得某个Window画面所属包名packageName和用户userId

在安卓上获得某个Window画面所属包名packageName和用户userId的方法 1&#xff0c;用到的工具如下&#xff1a; adb androidSDK里的monitor工具 adb shell dumpsys window animator adb shell dumpsys window命令 jdk 1.8已在安卓14模拟器上测试通过。 以AOSP的launcher中的m…