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