歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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. }  
Copyright © Linux教程網 All Rights Reserved