import java.io.Reader; import java.util.Scanner; import java.util.concurrent.ConcurrentHashMap; public class Relay { private Integer nextId; private Integer currentId; private ConcurrentHashMap idMap; private Scanner data; private Thread T; private boolean koniec; private boolean start; public synchronized void inform(){ notifyAll(); } public Relay(Reader reader) { data=new Scanner(reader); idMap=new ConcurrentHashMap(); T= new Thread(){ public void run(){ while(data.hasNextInt()){ synchronized (Relay.this){ if(nextId==null) { nextId = data.nextInt(); inform(); } try { wait(); } catch (InterruptedException e) { } } } koniec=true; inform(); } }; T.start(); } public synchronized void register(int id, Thread competitor) { idMap.put(competitor,id); } public synchronized void startRelayRace() { start=true; inform(); } public synchronized boolean dispatch() { if(koniec && nextId==null && currentId==null) { try { return false; } finally { inform(); } } while(!start){ try{ wait(); } catch (InterruptedException e) { } } if(idMap.get(Thread.currentThread()).equals(currentId) ){ currentId=null; inform(); } while(currentId!=null || !idMap.get(Thread.currentThread()).equals(nextId) ){ try { if(koniec && nextId==null && currentId==null) { try { return false; } finally { inform(); } } wait(); } catch (InterruptedException e) {} } currentId=nextId; nextId=null; inform(); return true; } }