nio

How to determine if a file will be logically moved or physically moved

别等时光非礼了梦想. 提交于 2020-01-15 10:22:43
问题 The facts: When a file is moved, there's two possibilities: The source and destination file are on the same partition and only the file system index is updated The source and destination are on two different file system and the file need to be moved byte per byte. (aka copy on move) The question: How can I determine if a file will be either logically or physically moved ? I'm transferring large files (700+ megs) and would adopt a different behaviors for each situation. Edit: I've already

【转】深入分析JAVA IO(BIO、NIO、AIO)

牧云@^-^@ 提交于 2020-01-15 08:03:49
IO的基本常识 1.同步 用户进程触发IO操作并等待或者轮询的去查看IO操作是否完成 2.异步 用户触发IO操作以后,可以干别的事,IO操作完成以后再通知当前线程继续处理 3.阻塞 当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务 4.非阻塞 当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入和输出通道。 IO事件驱动模式 在IO读写时,把 IO请求 与 读写操作 分离调配进行,需要用到事件分离器。根据处理机制的不同,事件分离器又分为:同步的Reactor和异步的Proactor。 Reactor模型: - 应用程序在事件分离器注册 读就绪事件 和 读就绪事件处理器 - 事件分离器等待读就绪事件发生 - 读就绪事件发生,激活事件分离器,分离器调用 读就绪事件处理器(即:可以进行读操作了,开始读) - 读事件处理器开始进行读操作,把读到的数据提供给程序使用 Proactor模型: - 应用程序在事件分离器注册 读完成事件 和 读完成事件处理器,并向操作系统发出异步读请求 - 事件分离器等待操作系统完成读取 - 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作

BIO、NIO实战

三世轮回 提交于 2020-01-15 07:39:48
BIO BIO:blocking IO,分别写一个服务端和客户端交互的C/S实例。服务器端: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.Charset; /** * Created by atai on 2019/3/19. */ public class BIOServer { private String host; private int port; private static Charset charset = Charset.forName("UTF-8"); public static void main(String[] args) { int port = 9010; try (ServerSocket ss = new ServerSocket(port)) { while (true) { Socket s = ss.accept(); BufferedReader reader = new BufferedReader(new InputStreamReader

BIO、NIO、AIO入门认识

梦想与她 提交于 2020-01-14 06:57:18
同步、异步。阻塞。非阻塞概念理解 。 同步: 比如在执行某个逻辑业务,在没有得到结果之前一直处于等待阻塞状态,得到结果后才继续执行 异步: 比如在执行某个逻辑业务,在没有得到结果可以去干其他的事情,等待通知再回来执行刚才没执行完的操作。 阻塞: 比如在执行某个逻辑业务,在结果没有返回之前,当前线程会被挂起,直到有结果了才继续执行 非阻塞: 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程的执行,继续执行直接返回      IO、BIO、NIO、AIO Java BIO : 同步并阻塞 ,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 Java NIO : 同步非阻塞 ,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 Java AIO(NIO.2) : 异步非阻塞 ,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。 IO :    IO操作分为两个部分:发起IO请求、IO数据读写,再简单一点就input和output流,作用于数据传   BIO : 同步阻塞IO   同步阻塞IO处理

Java NIO - using Selectors

夙愿已清 提交于 2020-01-14 01:39:17
问题 Got some quick questions on using a non blocking selector - answering any of the below would be greatly appreciated: I have just ben learning about the selector (java NIO model) and want to clarify some facts. Picked up most of the key points from tutorials as well as the SO question: Java NIO: Selectors so: from the question linked above, a Server socket channel is registered to listen for accept, when accepted a channel is registered for read and once read it is registered for write. How

Netty快速入门(06)Netty介绍

此生再无相见时 提交于 2020-01-14 01:06:14
前面简单的介绍了Java I/O 和NIO,写了示例程序。 Java I/O是阻塞的,为了让它支持多个并发,就要针对每个链接启动线程,这种方式的结果就是在海量链接的情况下,会创建海量的线程,就算用线程池去缓解,也是治标不治本。所以,Java I/O 不适合高并发高性能的网络编程需求。 NIO的出现就是为了解决这个问题,NIO中一个线程可以关注多个链接,解决了线程问题,前面也演示了如何用NIO编程。大家可以看到使用NIO是非常复杂的,可以说是陷阱重重,不是在网络编程方面很资深的程序员,很难用NIO编写出正常的程序,甚至高级程序员也不推荐用。 Netty介绍 写程序比较开心的就是碰到这种情况,一定会有很多框架去解决各种问题,比如JDBC直接写很复杂,就会有hibernate和mybatis等框架,让开发变得简单。NIO编程也是一样,出现过很多框架,相信很多人听说过mina框架,和netty是同一个作者。而netty是目前最流行的解决NIO编程问题的框架。我们打开netty的官网,https://netty.io,首页最上面就是netty的介绍: 翻译成中文就是: Netty是一个提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 用NIO也能开发这样的程序,但是很复杂,如果用netty,就能很简单很快速的开发高性能高可靠的程序

Java NIO 聊天室实例

我的梦境 提交于 2020-01-13 22:22:09
最近写了个Java NIO聊天室聊天的程序,NIO学习起来比较困难的,我的代码能给大家起到一个抛砖引玉的作用! 服务端: package test.javanio; /** * @author * @version * CreateTime:2010-12-1 下午05:12:11 * Description: */ 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.Date; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; public class MySocketServer implements Runnable { private boolean running;

Tomcat 9.0.26 高并发场景下DeadLock问题排查与修复

好久不见. 提交于 2020-01-13 12:57:38
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/-OcCDI4L5GR8vVXSYhXJ7w 作者:黄卫兵、陈锦霞 一、Tomcat容器 9.0.26 版本 Deadlock 问题 1.1 问题现象 1.1.1 发生 Deadlock 的背景 某接口/get.do压测,3分钟后,成功事务数TPS由1W骤降至0。 1.1.2 Tomcat服务器出现大量的CLOSE_WAIT 被压测服务器,出现TCP CLOSE_WAIT状态个数在200~2W左右。 1.2 初步定位:线程堆栈信息入手 通过jstack打印Tomcat堆栈信息,发现“Found 1 deadlock” Found one Java-level deadlock: ============================= "http-nio-8080-exec-409": waiting to lock monitor 0x00007f064805aa78 (object 0x00000006c0ebf148, a java.util.HashSet), which is held by "http-nio-8080-ClientPoller" "http-nio-8080-ClientPoller": waiting to lock monitor

BIO,NIO,AIO(NIO2)的理解

杀马特。学长 韩版系。学妹 提交于 2020-01-13 02:20:02
写在前面,这里所说的IO主要是强调的网络IO 1.BIO(同步并阻塞) 客户端一个请求对应一个线程。客户端上来一个请求(最开始的连接以及后续的IO请求),服务端新建一个线程去处理这个请求,由于线程总数是有限的(操作系统对线程总数的限制或者线程池的大小),所以,当达到最大值时给客户端的反馈就是无法响应, 阻塞体现在 服务端接收客户端 连接请求 被阻塞了,还有一种阻塞是在单线程处理某一个连接时,需要一直等待IO操作完成。 同步体现在 单个线程处理请求时 调用read(write) 方法需等待读取(写)操作完成才能返回。 2.NIO(同步非阻塞) 客户端一个IO请求对应一个线程。过程是这样的,每个客户端一开始上来的连接会注册到selector中,selector会轮询注册上来的连接是否有IO请求,如果有IO请求,就创建一个线程处理该连接上的该次请求。 非阻塞体现在 服务端能够无限量(相对于BIO)的接收客户端的连接请求。 同步体现在 单个线程处理请求时 调用read(write) 方法需等待读取(写)操作完成才能返回。这种模式下,如果后端应用处理遇到资源争夺(数据库操作)而阻塞等,为提高请求的处理速度,可以在后端设立资源池或队列等,把对应的请求数据以及现场(哪个连接的哪个请求等)放入队列,前台线程立即返回处理别的IO请求。 3.AIO(NIO2)(异步阻塞)

NIO非阻塞网络编程

十年热恋 提交于 2020-01-13 01:46:08
目录 目标 JAVA NIO Buffer缓冲区 Buffer工作原理 Buffer基本使用 ByteBuffer内存类型 Channel通道 SocketChannel ServerSocketChannel Selector选择器 NIO对比BIO 小结 目标 了解NIO、熟悉Buffer API、channel、selector,NIO+多线程 JAVA NIO NIO:new IO,非阻塞IO。 目的是为了解决替换掉IO网络编程的相关API。 Buffer缓冲区 内存块中包含了NIO Buffer对象,对象提供了一组方法,可以操作这个内存块。 比Input和output操作更方便更容易操作,写入和读取需要手动记录和跟进。 Buffer工作原理 更方便的操作,是因为里面记录了每一个操作点,同时还提供了数组操作的封装。 主要关注API的使用。 Buffer基本使用 注意读写的转换,读和写模式下参数含义不一样。 put();写 flip();转换 public static void main ( String [ ] args ) { // 构建一个byte字节缓冲区,容量是4,堆内的内存 ByteBuffer byteBuffer = ByteBuffer . allocate ( 4 ) ; // 默认写入模式,查看三个重要的指标 System . out .