ivana_andreevska

AV2 Threads and Conccurency

Aug 18th, 2022
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.52 KB | None | 0 0
  1. package AV2;
  2.  
  3. import java.util.concurrent.Semaphore;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;
  6.  
  7. public class Main {
  8. public static void main(String[] args) throws InterruptedException {
  9. // System.out.println("Exdecution into the main class");
  10. //
  11. // ThreadClass thread1=new ThreadClass();
  12. //thread1.run(); //so run ne se kreira nova niska tuku samo run metodot se vrsi vo main
  13. //za da se kreira nova niska i taa da se izvrsuva posebno mora start namesto run
  14. // thread1.start(); //kreiranje na nova niska
  15. //ist output no naredba za sout od ThreadClass se izvrsuva vo posebna niska+
  16. //povik na inrecementor
  17. Incrementor incrementor1 = new Incrementor();
  18. Incrementor incrementor2 = new Incrementor();
  19. //za da mozeme count (vo ovoj slucaj) da go zgolemime vo run metodoto t.e niskite da rabotat so incrementorot mora vo thread clasata da se deklaraira incrementor
  20.  
  21. ThreadClass t1 = new ThreadClass("T1", incrementor1);
  22. ThreadClass t2 = new ThreadClass("T2", incrementor2);
  23.  
  24. t1.start();
  25. t2.start();
  26.  
  27. //se vrsat naizmenicno bidejki schedueler im ima dadeno razlicni time slots vo koi treba da rabotat i imaat nepredvidlivi izvrsuvanja
  28.  
  29. //se dodeka ne se izvrsi prviot del i se dodeka ne se izvrsi vtoriot del cekaj:::
  30. t1.join();
  31. t2.join();
  32. //vo join mozeme da vneseme argument sto znaci za kolku vreme da zavrsi eden thread
  33. //cekaj da zavrsi za 5 skeundi , ako ne zavrsi prodolzi so dr instrukcii
  34.  
  35. ///VRATI SE NA OVA POSLE
  36. // if(t1.isAlive() && t2.isAlive())
  37. // {
  38. // //ne preminal vo sostojba dead
  39. // System.out.println("Thread is still alive");
  40. // //tuka pravime prisilen interrupt -> da premine threadot vo sostojva dead
  41. // t1.interrupt();
  42. // t2.interrupt();;
  43. // }
  44.  
  45. System.out.println(incrementor1.getCount());
  46. System.out.println(incrementor2.getCount());
  47. //se dodeka ne se izvrsat threadovite nema da dojdeme do pecatenjeto(vo ovoj slucaj)
  48. //mainot pobrzo stignuva do pecatenjeto kako proces otkolku zanimavanjeto so niskite
  49. //so join metod pravime stop na main dodeka ne zavrsi niska1 + niska2 ->se do togas ne izvrsuvaj nesto so se naoga posle niv
  50.  
  51.  
  52. }
  53. }
  54.  
  55. class Incrementor {
  56. private static int count = 0;
  57. //so static count ni e spodelena vrednost
  58. private static Semaphore semaphore = new Semaphore(2); //samo 1 thread da moze da pristapuva do kriticniot domen
  59.  
  60. //lock i unlock promenliva za mutex
  61. private Lock lock = new ReentrantLock(); //vo pozadina ima implementacija na mutex
  62.  
  63. public static void unsafeIncrement() throws InterruptedException {
  64. count++;
  65. //read count
  66. //increment count +1
  67. //write count
  68. //count promenlivata e kriticen domen bidejki poveke procesi probuvaat da pristapat do ovaa promenliva i zatoa count ne e atomicna operacija
  69.  
  70. ThreadClass.sleep(5);
  71. //thread vo koj se naogame da spie 5 sekundi dodeka ne se izvrsi count
  72. }
  73.  
  74. public static int getCount() {
  75. return count;
  76. }
  77.  
  78. public static void safeSemaphorIncrement() throws InterruptedException {
  79. semaphore.acquire(); //acquire ni kazuva deka nasiot semafor vo daden moment pravii acquire na nekoj od threadovite
  80. //kolku permirs->tolku acquires
  81. //predava permit na sleden koj ceka
  82. count++;
  83. }
  84.  
  85. public synchronized void safeIncrement() {
  86. count++;
  87. //za daden monitor ovaa f-ja da e sinhronziiran
  88. //monitor e samiot objekt/proces vo koj se naogame
  89. //mesto kade so mozeme da izvrsuvamme rab samo ako se naogame vo nego se dodeka ne zavrsi monnitoor na odreden thread nemoze dr thread da pristapi do ovaa fja
  90. // synchronized (this)
  91. // {
  92. // count++;
  93. // }
  94. }
  95.  
  96. public void safeClassIncrement() {
  97. synchronized (Incrementor.class) {
  98. count++;
  99. //sinhronizacija na nivo na klas
  100. }
  101. }
  102.  
  103. public void safeMutexIncrement() {
  104. //koga ke pristapime do fja zakluci ja elijata kade sto e count
  105. //pristapi zgolemi vrednost pa potoa napravi unlock
  106. lock.lock();
  107. count++;
  108. lock.unlock();
  109. }
  110.  
  111. //mutex e kluc ->go imame klucot i mozeme da pristapime do memorijata i lock_ja menuvame morijata unlock go davame klucot na sledniot thread koj ceka
  112. //vo incrementorot postavuvame lock promenliva
  113.  
  114. }
  115.  
  116. //mora override na run metoda
  117. //run metod se pojavuva koja kreriame nova niska
  118. //main metod ni e primarna niska od koja se povikvuvaat ostanati niski koi se kreiraar vo samata metoda
  119. class ThreadClass extends Thread {
  120.  
  121. String name;
  122. Incrementor incrementor;
  123.  
  124. public ThreadClass(String name, Incrementor incrementor) {
  125. this.name = name;
  126. this.incrementor = incrementor;
  127. }
  128. //sekoja instanca od thread class ke ima svoj incrementor
  129.  
  130.  
  131. @Override
  132. public void run() {
  133. //System.out.println("Execution in the Thread class");
  134.  
  135. for (int i = 0; i < 20; i++) {
  136. //System.out.println("Thread:" + name + ": " + i);
  137. incrementor.safeMutexIncrement();
  138. }
  139. }
  140. }
  141.  
  142. //semaforot ostava poveke da pristapuvaat do kriticniot domen za razlika od mutex koj ostava samo eden
  143. //vo semaforot() kako argument dozvoluvame t.e kazuvame kolku saamee da mozat da prisatapt do kriticniot domen
Add Comment
Please, Sign In to add comment