`
haoningabc
  • 浏览: 1482837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java共享内存nio

    博客分类:
  • java
阅读更多
http://coach.iteye.com/blog/738214
package com.unmi;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;

/**
 * 往 "共享内存" 写入数据
 * @author Unmi
 */
public class WriteShareMemory {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		RandomAccessFile raf = new RandomAccessFile("c:/swap.mm", "rw");
		FileChannel fc = raf.getChannel();
		MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 1024);
		
		//清除文件内容
		for(int i=0;i<1024;i++){
			mbb.put(i,(byte)0);
		}
		
		//从文件的第二个字节开始,依次写入 A-Z 字母,第一个字节指明了当前操作的位置
		for(int i=65;i<91;i++){
			int index = i-63;
			int flag = mbb.get(0); //可读标置第一个字节为 0
			if(flag != 0){ //不是可写标示 0,则重复循环,等待
				i --;
				continue;
			}
			mbb.put(0,(byte)1); //正在写数据,标志第一个字节为 1
			mbb.put(1,(byte)(index)); //写数据的位置
			
			System.out.println("程序 WriteShareMemory:"+System.currentTimeMillis() + 
					":位置:" + index +" 写入数据:" + (char)i);
			
			mbb.put(index,(byte)i);//index 位置写入数据
			mbb.put(0,(byte)2); //置可读数据标志第一个字节为 2
			Thread.sleep(513);
		}
	}
}



package com.unmi;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;

/**
 * 从 "共享内存" 读出数据
 * @author Unmi
 */
public class ReadShareMemory {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		RandomAccessFile raf = new RandomAccessFile("c:/swap.mm", "rw");
		FileChannel fc = raf.getChannel();
		MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 1024);
		int lastIndex = 0;

		for(int i=1;i<27;i++){
			int flag = mbb.get(0); //取读写数据的标志
			int index = mbb.get(1); //读取数据的位置,2 为可读

			if(flag != 2 || index == lastIndex){ //假如不可读,或未写入新数据时重复循环
				i--;
				continue;
			}
			
			lastIndex = index;
			System.out.println("程序 ReadShareMemory:" + System.currentTimeMillis() + 
					":位置:" + index +" 读出数据:" + (char)mbb.get(index));
			
			mbb.put(0,(byte)0); //置第一个字节为可读标志为 0
			
			if(index == 27){ //读完数据后退出
				break;
			}
		}
	}
}




分享到:
评论

相关推荐

    commons-mmf.rar_java nio_java共享内存_共享内存

    在Java中,可以通过`java.nio.MappedByteBuffer`类来实现共享内存功能,这被称为内存映射文件(Memory-Mapped File,MMF)。 `MappedByteBuffer`是NIO中的一种特殊缓冲区,它将文件的一部分映射到内存中,使得文件...

    IPC.rar_IPC_java i_java ipc_java共享内存_共享内存

    标题“IPC.rar_IPC_java i_java ipc_java共享内存_共享内存”以及描述“IPC共享内存,文件映射编程,实现原理详解”都指向了一个核心主题:Java中的进程间通信(IPC)以及如何利用共享内存进行数据交换。在这个话题中...

    Java NIO 中英文版 + Pro Java 7 NIO.2

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于高效处理I/O操作的重要框架。它在Java 1.4版本中被引入,替代了传统的IO模型,提供了更高级别的I/O操作机制,以适应并发编程的需求...

    java NIO技巧及原理

    4. **线程安全**:在多线程环境下使用NIO时,需要确保对共享资源的正确同步。 总之,Java NIO提供了强大的I/O能力,但同时也需要开发者对非阻塞I/O和多路复用有深入理解,才能充分发挥其优势,避免潜在的陷阱。学习...

    Java NIO 应用使用内存映射文件实现进程间通信

    在Windows系统中,内存映射文件可以是独立于物理文件的共享内存区域,通过命名来实现不同进程之间的数据共享。而在Java NIO中,MappedByteBuffer总是与特定的物理文件相关联,这意味着创建MappedByteBuffer时必须...

    JAVA NIO 异步通信模板服务端

    - **线程安全**:NIO操作通常是线程不安全的,所以在多线程环境下,需要对共享的Buffer和Channel进行适当的同步控制。 - **内存管理**:Buffer的容量应合理设置,避免频繁扩容或浪费内存。 - **异常处理**:正确处理...

    NIO 入门.chm,NIO 入门.chm

    9. **文件锁(File Locking)**:NIO提供了一种锁定文件部分区域的能力,这对于多线程或多进程共享文件时的数据同步非常重要。 NIO的使用虽然相对复杂,但它提供了更高效、灵活的I/O操作方式,尤其适用于处理大量...

    Java_NIO_API详解

    ### Java NIO API详解 #### 一、引言 在Java早期版本中,I/O操作主要依赖于`java.io`包中的流式API,这些API虽然简单易用,但其本质是阻塞式的,这意味着每次读写操作都会等待直至完成。这种机制在处理大量并发...

    java内存模型文档

    Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了线程如何共享和访问内存,以及在并发编程中如何处理数据一致性的问题。理解JMM对于编写高效、线程安全的Java代码至关重要。 1. ...

    Java NIO 中文版

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台从J2SE 1.4版本开始引入的一种新的I/O模型,是对传统的BIO(Blocking I/O)模型的一种有效补充。NIO的核心在于提供了一种能够避免线程在...

    Java内存模型详解

    Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)的一部分,用于规定程序中的各种变量(包括实例字段、静态字段和数组元素等)在多个线程共享内存中的读写行为。JMM的主要目的是确保所有线程能够看到一致...

    Java NIO.pdf

    ### Java NIO 相关知识点 #### 一、Java NIO 概述 - **Java NIO (New I/O)**:是 Java 平台提供的新 I/O 处理方式,首次出现在 Java SE 1.4 版本中。它提供了一种更高效地处理输入/输出操作的方法。 - **目标**:...

    Java运行内存分析

    除了上述内存区域外,Java还支持直接内存(Direct Memory),这部分内存并不由JVM直接管理,而是通过NIO(New Input/Output)类调用本地方法直接分配在Java堆外的内存,这些内存可以用来建立大型缓存等,从而提高IO...

    java内存模型介绍

    ### Java内存模型(JMM)详解 #### 1. JMM简介 Java内存模型(Java Memory Model,简称JMM)是Java虚拟机规范中定义的一套规定,用来描述Java程序中的各种变量(包括实例字段、静态字段和数组元素)在并发环境下的...

Global site tag (gtag.js) - Google Analytics