java nio 通道之pipe实现

简介: 这个pipe和linux系统上用来连接两个进程的pipe不是同一概念, 主要是在JVM内部,用来实现不同线程之间的数据同步。 这倒让我想起了go语言的channel技术。

这个pipe和linux系统上用来连接两个进程的pipe不是同一概念,

主要是在JVM内部,用来实现不同线程之间的数据同步。

这倒让我想起了go语言的channel技术。



package com.ronsoft.books.nio.channels;

import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.Pipe;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.util.Random;

public class PipeTest {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		WritableByteChannel out = Channels.newChannel(System.out);
		ReadableByteChannel workerChannel = startWorker(10);
		ByteBuffer buffer = ByteBuffer.allocate(100);
		while (workerChannel.read(buffer) >= 0) {
			buffer.flip();
			out.write(buffer);
			buffer.clear();
		}

	}
	
	private static ReadableByteChannel startWorker(int reps) throws Exception {
		Pipe pipe = Pipe.open();
		Worker worker = new Worker(pipe.sink(), reps);
		worker.start();
		return (pipe.source());
	}
	
	private static class Worker extends Thread {
		WritableByteChannel channel;
		private int reps;
		Worker(WritableByteChannel channel, int reps) {
			this.channel = channel;
			this.reps = reps;
		}
		public void run() {
			ByteBuffer buffer = ByteBuffer.allocate(100);
			try {
				for (int i = 0; i < this.reps; i++) {
					doSomeWork(buffer);
					while (channel.write(buffer) > 0) {
						
					}
				}
				this.channel.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		} 
	}
	
	private static String [] products = {
			"No good deed ges unpunished",
			"To be, or what?",
			"No matter where you go, there you are",
			"Just say \"Yo\"",
			"My karma ran over my dogma"
	};
	private static Random rand = new Random();
	private static void doSomeWork(ByteBuffer buffer) {
		int product = rand.nextInt(products.length);
		buffer.clear();
		buffer.put(products[product].getBytes());
		buffer.put("\r\n".getBytes());
		buffer.flip();
	}

}


Just say "Yo"
No good deed ges unpunished
To be, or what?
No good deed ges unpunished
To be, or what?
Just say "Yo"
Just say "Yo"
No matter where you go, there you are
No good deed ges unpunished
Just say "Yo"


目录
相关文章
|
2月前
|
存储 Java 数据处理
|
2月前
|
Java API
java中IO与NIO有什么不同
java中IO与NIO有什么不同
|
17天前
|
缓存 Java API
Java NIO和IO之间的区别
NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
16 1
|
22天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
24天前
|
存储 监控 Java
浅谈Java NIO
浅谈Java NIO
7 0
|
25天前
|
消息中间件 存储 Java
【Java NIO】那NIO为什么速度快?
是这样的,在NIO零拷贝出现之前,一个I/O操作会将同一份数据进行多次拷贝。可以看下图,一次I/O操作对数据进行了四次复制,同时来伴随两次内核态和用户态的上下文切换,众所周知上下文切换是很耗费性能的操作。
29 1
【Java NIO】那NIO为什么速度快?
|
27天前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java NIO是一种高效I/O库,特征包括非阻塞性操作、通道(如文件、网络连接)、缓冲区和选择器。选择器监控通道状态变化,通知应用程序数据可读写,避免轮询,提升性能。示例代码展示了一个使用NIO的服务器,监听连接、读取数据并处理客户端通信。
14 1
|
3月前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
|
3月前
|
网络协议 Java Linux
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
|
3月前
|
编解码 网络协议 Java
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论