歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java實現內存共享

Java實現內存共享

日期:2017/3/1 10:19:17   编辑:Linux編程

Java內存共享就是對同一段內存的讀寫;用來進行進程之間的通信。

首先是寫的代碼:

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