Java实现内存共享


Java内存共享就是对同一段内存的读写;用来进行进程之间的通信。

首先是写的代码:

  1. package com.sharememory.test;   
  2.   
  3. import java.io.IOException;   
  4. import java.io.RandomAccessFile;   
  5. import java.nio.MappedByteBuffer;   
  6. import java.nio.channels.FileChannel;   
  7. import java.nio.channels.FileLock;   
  8.   
  9. public class WriteMemory {   
  10.     String fileName = "shm.lock";   
  11.     RandomAccessFile raFile;   
  12.     FileChannel fc;   
  13.     int iSize = 1024;   
  14.     MappedByteBuffer mapBuf;   
  15.     int iMode;   
  16.   
  17.     public WriteMemory() {   
  18.         try {   
  19.             init();   
  20.         } catch (Exception e) {   
  21.             e.printStackTrace();   
  22.         }   
  23.     }   
  24.   
  25.     public void init() throws Exception {   
  26.         raFile = new RandomAccessFile(fileName, "rw");   
  27.         fc = raFile.getChannel();   
  28.         mapBuf = fc.map(FileChannel.MapMode.READ_WRITE, 0, iSize);   
  29.     }   
  30.   
  31.     public void clearBuffer() {   
  32.         // 清除文件内容   
  33.         for (int i = 0; i < 1024; i++) {   
  34.             mapBuf.put(i, (byte0);   
  35.         }   
  36.     }   
  37.   
  38.     public void putBuffer() throws Exception{   
  39.         for (int i = 65; i < 91; i++) {   
  40.             int index = i - 63;   
  41.             int flag = mapBuf.get(0); // 可读标置第一个字节为 0   
  42.             if (flag != 0) { // 不是可写标示 0,则重复循环,等待   
  43.                 i--;   
  44.                 continue;   
  45.             }   
  46.             mapBuf.put(0, (byte1); // 正在写数据,标志第一个字节为 1   
  47.             mapBuf.put(1, (byte) (index)); // 写数据的位置   
  48.   
  49.             System.out.println("程序 WriteShareMemory:"  
  50.                     + System.currentTimeMillis() + ":位置:" + index + " 写入数据:"  
  51.                     + (char) i);   
  52.   
  53.             mapBuf.put(index, (byte) i);// index 位置写入数据   
  54.             mapBuf.put(0, (byte2); // 置可读数据标志第一个字节为 2   
  55.             Thread.sleep(513);   
  56.         }   
  57.     }   
  58.   
  59.     public boolean getLock() {   
  60.         FileLock lock = null;   
  61.         try {   
  62.             lock = fc.tryLock();   
  63.         } catch (IOException e) {   
  64.             e.printStackTrace();   
  65.         }   
  66.         if (lock == null) {   
  67.             return false;   
  68.         } else {   
  69.             return true;   
  70.         }   
  71.     }   
  72.   
  73.     public static void main(String[] args) {   
  74.         // TODO Auto-generated method stub   
  75.         WriteMemory map = new WriteMemory();   
  76.         if (map.getLock()) {   
  77.             try {   
  78.                 map.putBuffer();   
  79.             } catch (Exception e) {   
  80.                 e.printStackTrace();   
  81.             }   
  82.         } else {   
  83.             System.out.println("can't get lock");   
  84.         }   
  85.     }   
  86. }  
  • 1
  • 2
  • 下一页

相关内容