Facebook
From Capacious Partdridge, 7 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 254
  1. import java.io.Reader;
  2. import java.util.*;
  3.  
  4. public class Relay implements Runnable {
  5.     boolean gotowy, koniec, biega;
  6.     Scanner odczyt;
  7.     int aktualnyId;
  8.     Thread aktualnyThread;
  9.  
  10.     Map<Integer, Thread> mapa;
  11.  
  12.     public Relay(Reader reader) {
  13.         gotowy = false;
  14.         koniec = false;
  15.         biega = false;
  16.         aktualnyId = -1;
  17.         odczyt = new Scanner(reader);
  18.         mapa = new HashMap<>();
  19.     }
  20.  
  21.     public void register(int id, Thread competitor) {
  22.         mapa.put(id, competitor);
  23.         //zglasza do udzialu w sztafecie watek i nadaje mu identyfikator id
  24.     }
  25.  
  26.     public void startRelayRace() {
  27.         //ustawia zmienna ze bieg sie rozpoczal
  28.         gotowy = true;
  29.         for (Thread t : mapa.values()) {
  30.             synchronized (t) {
  31.                 t.notify();
  32.                 //informuje wszystkich zawodnikow ze juz czas
  33.             }
  34.         }
  35.         //rozpoczyna wypuszczanie zawodnikow.
  36.     }
  37.  
  38.     public boolean dispatch() {
  39.         if (koniec == true) {
  40.             return false;
  41.             //Reader dostarczyl koniec pliku, sztafeta powinna zostac zakonczona
  42.             //(wszyscy zawodnicy wychodza z dispatch z false)
  43.         }
  44.  
  45.         if (aktualnyThread == Thread.currentThread()) {
  46.             biega = false;
  47.             //aktualnyThread watek powrocil
  48.         }
  49.  
  50.         while (gotowy == false) {
  51.             synchronized (Thread.currentThread()) {
  52.                 try {
  53.                     Thread.currentThread().wait();
  54.                     //bieg sie nie zaczal to kazujemy czekac tym co chca biec
  55.                 } catch (InterruptedException problem) {
  56.                 }
  57.             }
  58.         }
  59.  
  60.         synchronized (this) {
  61.             if (aktualnyId == -1 && biega == false) {
  62.                 //nikt nie biegnie aktualnie
  63.                 if (!odczyt.hasNextInt()) {
  64.                     //reader zakonczyl czytanie
  65.                     koniec = true;
  66.                     for (Thread t : mapa.values()) {
  67.                         synchronized (t) {
  68.                             t.notify();
  69.                         }
  70.                         //informuje ze koniec
  71.                     }
  72.                     //metoda zwraca false jezeli sztafeta sie zakonczyla
  73.                     return false;
  74.                 }
  75.  
  76.                 if (aktualnyId == -1) {
  77.                     aktualnyId = odczyt.nextInt();
  78.                     //pobranie id kolejnego do biegu
  79.                 }
  80.  
  81.                 synchronized (mapa.get(aktualnyId)) {
  82.                     mapa.get(aktualnyId).notify();
  83.                     //poinformuj watek ze jego kolej
  84.                 }
  85.             }
  86.         }
  87.  
  88.         while (aktualnyId == -1 || Thread.currentThread() != mapa.get(aktualnyId)) {
  89.             synchronized (Thread.currentThread()) {
  90.                 //zly gosc sie zglasza lub nie chcemy wypuszczac to kazemy czekac
  91.                 try {
  92.                     Thread.currentThread().wait();
  93.                 } catch (InterruptedException problem) {
  94.                 }
  95.             }
  96.             if (koniec == true) {
  97.                 return false;
  98.                 //bieg sie zakonczyl bo reader nie daje numerkow
  99.             }
  100.         }
  101.         aktualnyId = -1;
  102.         //wypuszczamy kolejnego co mial byc w kolejce
  103.         aktualnyThread = Thread.currentThread();
  104.         biega = true;
  105.         //ustawiamy biegacza aktualnego
  106.         return biega;
  107.         //metoda zwraca true wypuszczajac zawodnika na bieznie
  108.     }
  109.  
  110.     public void run() {
  111.  
  112.     }
  113. }