Advertisement
Harvester1971

zad1

Nov 5th, 2024
26
0
29 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.29 KB | None | 0 0
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6. package values;
  7. import java.util.concurrent.Semaphore;
  8. /**
  9.  *
  10.  * @author Rau7
  11.  */
  12. public class FirstValue {
  13.     private static int A = 0;
  14.     private static int B = 0;
  15.     private static int C = 3;
  16.     private static final int SLEEP = 1;
  17.     //declare all necessary semaphores
  18.     //private static final Semaphore NONAME = new Semaphore(1, true);
  19.     private static final Semaphore a1 = new Semaphore(0, true);
  20.     private static final Semaphore a2 = new Semaphore(1, true);
  21.     private static final Semaphore a3 = new Semaphore(0, true);
  22.     private static final Semaphore a4 = new Semaphore(0, true);
  23.     public static void main(String[] args) {
  24.         new P2().start();
  25.         new P1().start();
  26.         new P3().start();
  27.         new P4().start();
  28.         //Tutaj suma ma być równa 16
  29.         /*
  30.         Z wątku P2 wykonuję tylko B=B+C - ten startuje jako pierwszy
  31.         Z wątku P1 wykonuję tylko A=10
  32.         Suma 10+3+3 = 16
  33.         Z wątku P4 wyswietlam wynik
  34.        
  35.         zwalniam pozostałe aktywne wątki, żeby nie "wisiały"
  36.          */
  37.     }
  38.     private static final class P1 extends Thread {
  39.         @Override
  40.         public void run() {
  41.             try {
  42.                 Thread.sleep(SLEEP);
  43.                 System.out.println("Thread P1 is running...");
  44.                 a1.acquire();//czekam na zezwolenie z wątku P1
  45.                 A = 10;
  46.                 a4.release();//zwalniam wątek P4 (drukowanie)
  47.                 a1.acquire();//i blokuję siebie przed wykonaniem kolejnych instrukcji
  48.                 B = B + 5;
  49.                 C = C + A;
  50.                 Thread.sleep(SLEEP);
  51.                 System.out.println("Thread P1 is done...");
  52.             } catch (InterruptedException ex) {
  53.                 System.out.println("Ooops...");
  54.                 Thread.currentThread().interrupt();
  55.                 throw new RuntimeException(ex);
  56.             }
  57.         }
  58.     }
  59.     private static final class P2 extends Thread {
  60.         @Override
  61.         public void run() {
  62.             try {
  63.                 Thread.sleep(SLEEP);
  64.                 System.out.println("Thread P2 is running...");
  65.                 B = B + C;
  66.                 a1.release();//zwalniam wątek P1
  67.                 a2.acquire();//blokuję siebie
  68.                 A = A + B;
  69.                 Thread.sleep(SLEEP);
  70.                 System.out.println("Thread P2 is done...");
  71.             } catch (InterruptedException ex) {
  72.                 System.out.println("Ooops...");
  73.                 Thread.currentThread().interrupt();
  74.                 throw new RuntimeException(ex);
  75.             }
  76.         }
  77.     }
  78.     private static final class P3 extends Thread {
  79.         @Override
  80.         public void run() {
  81.             try {
  82.                 Thread.sleep(SLEEP);
  83.                 System.out.println("Thread P3 is running...");
  84.                 a3.acquire();//czekam na zezwolenie
  85.                 C = B + 10;
  86.                 A = 2 * A;
  87.                 B = B + A;
  88.                 System.out.println("Thread P3 is done...");
  89.                 //Ten wątek kończy ostatni, nikogo nie musi wpuszczać
  90.             } catch (InterruptedException ex) {
  91.                 System.out.println("Ooops...");
  92.                 Thread.currentThread().interrupt();
  93.                 throw new RuntimeException(ex);
  94.             }
  95.         }
  96.     }
  97.     private static final class P4 extends Thread {
  98.         @Override
  99.         public void run() {
  100.             try {
  101.                 a4.acquire();
  102.                 System.out.println("Thread 4 is running");
  103.                 Thread.sleep(SLEEP);
  104.                 System.out.println("Sum result: " + A + " + " + B + " + " + C + " = " + (A + B + C));
  105.                 Thread.sleep(SLEEP);
  106.                 System.out.println("Thread P4 is done...");
  107.                 //Właściwie trzeba by puścić oczekujące wątki
  108.                 a1.release();
  109.                 a3.release();
  110.             } catch (InterruptedException ex) {
  111.                 System.out.println("Ooops...");
  112.                 Thread.currentThread().interrupt();
  113.                 throw new RuntimeException(ex);
  114.             }
  115.         }
  116.     }
  117. }
  118.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement