Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. import java.util.concurrent.locks.Lock;
  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.ReentrantLock;
  4.  
  5. public class Czytelnia
  6. {
  7. static int liczba_czyt=0;
  8. static int liczba_pisz=0;
  9. final ReentrantLock lock = new ReentrantLock();
  10. final Condition czytelnik = lock.newCondition();
  11. final Condition pisarz = lock.newCondition();
  12.  
  13.  
  14. Czytelnia()
  15. {
  16. this.liczba_czyt = this.liczba_pisz=0;
  17. }
  18.  
  19. public void chce_czytac()
  20. {
  21.  
  22. lock.lock();
  23. if(liczba_pisz>0 || lock.hasWaiters(pisarz))
  24. {
  25. try {
  26. czytelnik.await();
  27. } catch (InterruptedException e) {
  28. // TODO Automatycznie generowany blok catch
  29. e.printStackTrace();
  30. }
  31. }
  32. liczba_czyt++;
  33.  
  34. czytelnik.signal();
  35.  
  36. lock.unlock();
  37.  
  38.  
  39. }
  40.  
  41. public void chce_pisac()
  42. {
  43. lock.lock();
  44.  
  45. if(liczba_czyt+liczba_pisz >0)
  46. {
  47. try {
  48. pisarz.await();
  49. } catch (InterruptedException e) {
  50. // TODO Automatycznie generowany blok catch
  51. e.printStackTrace();
  52. }
  53. }
  54. liczba_pisz++;
  55.  
  56. lock.unlock();
  57. }
  58.  
  59.  
  60.  
  61. public void koniec_czytania()
  62. { lock.lock();
  63. liczba_czyt--;
  64. if(liczba_czyt== 0)
  65. {
  66. pisarz.signal();
  67. }
  68. lock.unlock();
  69. }
  70.  
  71. public void koniec_pisania()
  72. { lock.lock();
  73. liczba_pisz--;
  74. if(lock.hasWaiters(czytelnik))
  75. {
  76. czytelnik.signal();
  77. }
  78. else
  79. {
  80. pisarz.signal();
  81. }
  82. lock.unlock();
  83. }
  84.  
  85.  
  86.  
  87.  
  88.  
  89. public static void main(String[] args)
  90.  
  91. {
  92.  
  93. Czytelnia czytelnia = new Czytelnia();
  94.  
  95. for (int i = 0; i <10000000 ; i++)
  96. {
  97. if((i+1 )% 10 == 0)
  98.  
  99. {
  100. new pisarz(czytelnia).start();
  101. }
  102.  
  103. else
  104. new czytelnik(czytelnia).start();
  105.  
  106. } }
  107. }
  108.  
  109.  
  110.  
  111. public class pisarz extends Thread {
  112.  
  113. private static int idCounter = 0;
  114. private int id;
  115. private Czytelnia czytelnia;
  116.  
  117. public pisarz(Czytelnia czytelnia) {
  118. this.czytelnia = czytelnia;
  119. this.id = pisarz.idCounter++;
  120. }
  121. @Override
  122. public void run() {
  123.  
  124. System.out.println("Pisarz (ID:" + id + ") czeka.");
  125.  
  126. czytelnia.chce_pisac();
  127.  
  128. System.out.println("\tPisarz (ID:" + id + ") pisze.");
  129.  
  130. try {
  131. Thread.sleep(500);
  132. } catch (InterruptedException e) {
  133. // TODO
  134. }
  135.  
  136. System.out.println("\t\tPisarz (ID:" + id + ") wychodzi.");
  137.  
  138. czytelnia.koniec_pisania();
  139.  
  140. }
  141. }
  142.  
  143.  
  144.  
  145. public class czytelnik extends Thread {
  146.  
  147. private static int idCounter = 0;
  148. private int id;
  149. private Czytelnia czytelnia;
  150.  
  151. public czytelnik(Czytelnia czytelnia) {
  152. this.czytelnia = czytelnia;
  153. this.id = czytelnik.idCounter++;
  154. }
  155.  
  156. @Override
  157. public void run() {
  158.  
  159. System.out.println("Czytelnik (ID:" + id + ") czeka.");
  160.  
  161. czytelnia.chce_czytac();
  162.  
  163. System.out.println("\tCzytelnik (ID:" + id + ") czyta.");
  164.  
  165. try {
  166. Thread.sleep(1000);
  167. } catch (InterruptedException e) {
  168. // TODO
  169. }
  170.  
  171. System.out.println("\t\tCzytelnik (ID:" + id + ") wychodzi.");
  172.  
  173. czytelnia.koniec_czytania();
  174.  
  175. }
  176.  
  177.  
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement