import java.io.Reader;
import java.util.Scanner;
import java.util.concurrent.ConcurrentHashMap;
public class Relay {
private Integer nextId;
private Integer currentId;
private ConcurrentHashMap<Thread,Integer> 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<Thread,Integer>();
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;
}
}
{"html5":"htmlmixed","css":"css","javascript":"javascript","php":"php","python":"python","ruby":"ruby","lua":"text\/x-lua","bash":"text\/x-sh","go":"go","c":"text\/x-csrc","cpp":"text\/x-c++src","diff":"diff","latex":"stex","sql":"sql","xml":"xml","apl":"apl","asterisk":"asterisk","c_loadrunner":"text\/x-csrc","c_mac":"text\/x-csrc","coffeescript":"text\/x-coffeescript","csharp":"text\/x-csharp","d":"d","ecmascript":"javascript","erlang":"erlang","groovy":"text\/x-groovy","haskell":"text\/x-haskell","haxe":"text\/x-haxe","html4strict":"htmlmixed","java":"text\/x-java","java5":"text\/x-java","jquery":"javascript","mirc":"mirc","mysql":"sql","ocaml":"text\/x-ocaml","pascal":"text\/x-pascal","perl":"perl","perl6":"perl","plsql":"sql","properties":"text\/x-properties","q":"text\/x-q","scala":"scala","scheme":"text\/x-scheme","tcl":"text\/x-tcl","vb":"text\/x-vb","verilog":"text\/x-verilog","yaml":"text\/x-yaml","z80":"text\/x-z80"}