import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
public class Main {
public static void main
(String[] args
) { final AtomicBoolean flag = new AtomicBoolean(false);
for (int i = 0 ; i < runners.length; i++){
runners
[i
] = new Thread("Runner # " + i
){ @Override
public void run() {
try {
// wait for random time
Thread.
sleep(1000 + random.
nextInt(1000));
// try to claim the flag
boolean claimed = flag.compareAndSet(false,true);
if(claimed){
System.
out.
println(this.
getName() + " has won the race.");
// interrupt others
if(!t.equals(this)){
t.interrupt();
}
}
}else {
System.
out.
println(this.
getName() + " has very closely lost the race."); }
System.
out.
println(this.
getName() + " has lost the race."); }
}
};
}
// get set go
for (int i = 0 ; i < runners.length; i++){
runners[i].start();
}
}
}
CmltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CgpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBmbGFnID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwoKICAgICAgICBmaW5hbCBUaHJlYWRbXSBydW5uZXJzID0gbmV3IFRocmVhZFs1XTsKCiAgICAgICAgZmluYWwgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcnVubmVycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIHJ1bm5lcnNbaV0gPSBuZXcgVGhyZWFkKCJSdW5uZXIgIyAiICsgaSl7CiAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciByYW5kb20gdGltZQogICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCArIHJhbmRvbS5uZXh0SW50KDEwMDApKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBjbGFpbSB0aGUgZmxhZwogICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNsYWltZWQgPSBmbGFnLmNvbXBhcmVBbmRTZXQoZmFsc2UsdHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihjbGFpbWVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldE5hbWUoKSArICIgaGFzIHdvbiB0aGUgcmFjZS4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcnJ1cHQgb3RoZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFRocmVhZCB0IDogcnVubmVycyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXQuZXF1YWxzKHRoaXMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldE5hbWUoKSArICIgaGFzIHZlcnkgY2xvc2VseSBsb3N0IHRoZSByYWNlLiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0TmFtZSgpICsgIiBoYXMgbG9zdCB0aGUgcmFjZS4iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvLyBnZXQgc2V0IGdvCiAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcnVubmVycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIHJ1bm5lcnNbaV0uc3RhcnQoKTsKICAgICAgICB9CiAgICB9Cn0=