歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 用Java實現的第二類讀者寫者問題

用Java實現的第二類讀者寫者問題

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

用Java實現的第二類讀者寫者問題:

  1. //--Semaphore.java</PRE><PRE class=java name="code">package rw;
  2. public class Semaphore {
  3. private int value;//記錄希望訪問臨界資源的線程的計數器個數
  4. public Semaphore(int i)
  5. {
  6. this.value=i;
  7. }
  8. public synchronized void P()
  9. {
  10. value--;
  11. if(value<0)
  12. try {
  13. wait();
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. Thread.currentThread().interrupt();
  17. }
  18. }
  19. public synchronized void V()
  20. {
  21. value++;
  22. if(value<=0)
  23. {
  24. notifyAll();
  25. }
  26. }
  27. }</PRE><BR>
  28. <PRE class=java name="code">//------------------------------文件2 ReaderWriter.java------------------------------------------------
  29. package rw;
  30. import java.io.FileNotFoundException;
  31. import java.io.PrintStream;
  32. public class ReaderWriter extends Thread{
  33. String msg;
  34. int NO;
  35. final int N=100;
  36. static public int num=0;
  37. static public int readers=0;
  38. static public int writers=0;
  39. final static public String base="Last Writer:";
  40. static public String resource=base+"0";
  41. static Semaphore mutexr=new Semaphore(1);
  42. static Semaphore mutexw=new Semaphore(1);
  43. static Semaphore mutex=new Semaphore(1);
  44. static Semaphore mutexWrite=new Semaphore(1);
  45. public ReaderWriter()
  46. {
  47. NO=num++;
  48. if(NO%N!=1)
  49. msg="I am reader @"+NO;
  50. else
  51. msg="I am writer @"+NO;
  52. }
  53. public void read()
  54. {
  55. if(writers!=0)//如果有寫者,阻塞,並且後續的讀者不許進來
  56. mutex.P();
  57. mutexr.P();
  58. readers++;
  59. if(readers==1)//保證當讀的時候,對寫互斥,寫者等待
  60. mutexWrite.P();
  61. mutexr.V();
  62. //.............................................讀開始...
  63. System.out.println(" "+NO+" is reading, resource=" +resource);
  64. //.............................................讀結束...
  65. mutexr.P();
  66. readers--;
  67. if(readers==0)
  68. mutexWrite.V();
  69. mutexr.V();
  70. if(writers!=0)//如果有寫者,阻塞,並且後續的讀者不許進來
  71. mutex.V();
  72. }
  73. public void write()
  74. {
  75. mutexw.P();
  76. writers++;
  77. if(writers==1)
  78. mutex.P();
  79. mutexw.V();
  80. //.....................................................寫開始
  81. mutexWrite.P();
  82. resource="base"+NO;
  83. System.out.println(NO+" IS WRITING, resource=" +resource);
  84. mutexWrite.V();
  85. //.....................................................寫結束
  86. mutexw.P();
  87. writers--;
  88. if(writers==0)
  89. mutex.V();
  90. mutexw.V();
  91. }
  92. public void run()
  93. {
  94. int n=1000;
  95. while(n-->0)
  96. {
  97. if(NO%N!=1)
  98. {/*
  99. try {
  100. Thread.sleep(1);
  101. } catch (InterruptedException e) {
  102. // TODO Auto-generated catch block
  103. e.printStackTrace();
  104. }
  105. */
  106. read();
  107. }
  108. else
  109. {
  110. write();
  111. /*
  112. try {
  113. Thread.sleep(100);
  114. } catch (InterruptedException e) {
  115. // TODO Auto-generated catch block
  116. e.printStackTrace();
  117. }
  118. */
  119. }
  120. }
  121. }
  122. public static void main(String args[])
  123. {
  124. PrintStream ps;
  125. try {
  126. ps = new PrintStream("D:\\readerWriter.txt");
  127. System.setOut(ps);
  128. } catch (FileNotFoundException e) {
  129. e.printStackTrace();
  130. }
  131. for(int i=0;i<1000;i++)
  132. {
  133. new ReaderWriter().start();
  134. }
  135. }
  136. }
Copyright © Linux教程網 All Rights Reserved