import java.util.concurrent.atomic.AtomicInteger;
public class Main {
private static final long MAX_RUN_TIME = 5000l;
private static final long ESTIMATED_OVERHEAD = 125l;
public static AtomicInteger totalCalculations = new AtomicInteger(0);
final long startTime
= System.
currentTimeMillis(); final int NUM_CPU_CORES
= Runtime.
getRuntime().
availableProcessors();
System.
out.
println("Starting on " + NUM_CPU_CORES
+ " threads."); final Thread[] threads
= createThreads
(NUM_CPU_CORES,
new WorkPackage
()); startThreads(threads);
@Override
public void run(){
long currentTime = 0;
long elapsedTime = 0;
long remainingTime = MAX_RUN_TIME;
while(elapsedTime < (MAX_RUN_TIME - ESTIMATED_OVERHEAD)) {
if(remainingTime > ESTIMATED_OVERHEAD) {
try {
Thread.
sleep(remainingTime
- ESTIMATED_OVERHEAD
); e.printStackTrace();
}
}
currentTime
= System.
currentTimeMillis(); elapsedTime = currentTime - startTime;
remainingTime = MAX_RUN_TIME - elapsedTime;
}
stopThreads(threads);
System.
out.
println("Completed " + totalCalculations.
intValue() + " useless calculations over " + (currentTime-startTime)/1000f + " seconds!");
Thread.
currentThread().
interrupt(); }
}).start();
}
private static Thread[] createThreads
(final int numCpuCores,
final Runnable runnable
) { for(int i=0; i<numCpuCores; i++) {
workerThreads
[i
] = new Thread(runnable
); }
return workerThreads;
}
private static void startThreads
(final Thread[] threadsToRun
) { for(Thread thread
: threadsToRun
) { thread.start();
}
}
private static void stopThreads
(final Thread[] threadsToStop
) { for(Thread thread
: threadsToStop
) { thread.interrupt();
}
}
}
@Override
public void run() {
while(!Thread.
interrupted()) { int result
= xorShiftRandom
(Integer.
MAX_VALUE) + xorShiftRandom
(Integer.
MAX_VALUE); Main.totalCalculations.incrementAndGet();
}
}
private long currentValue
= System.
currentTimeMillis(); private int xorShiftRandom(final int max) {
currentValue ^= (currentValue << 21);
currentValue ^= (currentValue >>> 35);
currentValue ^= (currentValue << 4);
int out = (int) currentValue % max;
return (out < 0) ? -out : out;
}
}
aW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwoKcHVibGljIGNsYXNzIE1haW4gewoKCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX1JVTl9USU1FID0gNTAwMGw7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVTVElNQVRFRF9PVkVSSEVBRCA9IDEyNWw7CgoJcHVibGljIHN0YXRpYyBBdG9taWNJbnRlZ2VyIHRvdGFsQ2FsY3VsYXRpb25zID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CgoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewoKCQlmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCWZpbmFsIGludCBOVU1fQ1BVX0NPUkVTID0gUnVudGltZS5nZXRSdW50aW1lKCkuYXZhaWxhYmxlUHJvY2Vzc29ycygpOwoKCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIG9uICIgKyBOVU1fQ1BVX0NPUkVTICsgIiB0aHJlYWRzLiIpOwoJCWZpbmFsIFRocmVhZFtdIHRocmVhZHMgPSBjcmVhdGVUaHJlYWRzKE5VTV9DUFVfQ09SRVMsIG5ldyBXb3JrUGFja2FnZSgpKTsKCQlzdGFydFRocmVhZHModGhyZWFkcyk7CgoJCW5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewoJCQlAT3ZlcnJpZGUKCQkJcHVibGljIHZvaWQgcnVuKCl7CgkJCQlsb25nIGN1cnJlbnRUaW1lID0gMDsKCQkJCWxvbmcgZWxhcHNlZFRpbWUgPSAwOwoJCQkJbG9uZyByZW1haW5pbmdUaW1lID0gTUFYX1JVTl9USU1FOwoKCQkJCXdoaWxlKGVsYXBzZWRUaW1lIDwgKE1BWF9SVU5fVElNRSAtIEVTVElNQVRFRF9PVkVSSEVBRCkpIHsKCQkJCQlpZihyZW1haW5pbmdUaW1lID4gRVNUSU1BVEVEX09WRVJIRUFEKSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlUaHJlYWQuc2xlZXAocmVtYWluaW5nVGltZSAtIEVTVElNQVRFRF9PVkVSSEVBRCk7CgkJCQkJCX0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewoJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQljdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCQkJCWVsYXBzZWRUaW1lID0gY3VycmVudFRpbWUgLSBzdGFydFRpbWU7CgkJCQkJcmVtYWluaW5nVGltZSA9IE1BWF9SVU5fVElNRSAtIGVsYXBzZWRUaW1lOwoJCQkJfQoKCQkJCXN0b3BUaHJlYWRzKHRocmVhZHMpOwoJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21wbGV0ZWQgIiArIHRvdGFsQ2FsY3VsYXRpb25zLmludFZhbHVlKCkgKyAiIHVzZWxlc3MgY2FsY3VsYXRpb25zIG92ZXIgIgoJCQkJCQkrIChjdXJyZW50VGltZS1zdGFydFRpbWUpLzEwMDBmICsgIiBzZWNvbmRzISIpOwoJCQkJU3lzdGVtLmV4aXQoMCk7CgkJCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwoJCQl9CgkJfSkuc3RhcnQoKTsKCX0KCglwcml2YXRlIHN0YXRpYyBUaHJlYWRbXSBjcmVhdGVUaHJlYWRzKGZpbmFsIGludCBudW1DcHVDb3JlcywgZmluYWwgUnVubmFibGUgcnVubmFibGUpIHsKCQlUaHJlYWRbXSB3b3JrZXJUaHJlYWRzID0gbmV3IFRocmVhZFtudW1DcHVDb3Jlc107CgkJZm9yKGludCBpPTA7IGk8bnVtQ3B1Q29yZXM7IGkrKykgewoJCQl3b3JrZXJUaHJlYWRzW2ldID0gbmV3IFRocmVhZChydW5uYWJsZSk7CgkJfQoJCXJldHVybiB3b3JrZXJUaHJlYWRzOwoJfQoKCXByaXZhdGUgc3RhdGljIHZvaWQgc3RhcnRUaHJlYWRzKGZpbmFsIFRocmVhZFtdIHRocmVhZHNUb1J1bikgewoJCWZvcihUaHJlYWQgdGhyZWFkIDogdGhyZWFkc1RvUnVuKSB7CgkJCXRocmVhZC5zdGFydCgpOwoJCX0KCX0KCglwcml2YXRlIHN0YXRpYyB2b2lkIHN0b3BUaHJlYWRzKGZpbmFsIFRocmVhZFtdIHRocmVhZHNUb1N0b3ApIHsKCQlmb3IoVGhyZWFkIHRocmVhZCA6IHRocmVhZHNUb1N0b3ApIHsKCQkJdGhyZWFkLmludGVycnVwdCgpOwoJCX0KCX0KfQoKY2xhc3MgV29ya1BhY2thZ2UgaW1wbGVtZW50cyBSdW5uYWJsZSB7CglAT3ZlcnJpZGUKCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQl3aGlsZSghVGhyZWFkLmludGVycnVwdGVkKCkpIHsKCQkJaW50IHJlc3VsdCA9IHhvclNoaWZ0UmFuZG9tKEludGVnZXIuTUFYX1ZBTFVFKSArIHhvclNoaWZ0UmFuZG9tKEludGVnZXIuTUFYX1ZBTFVFKTsKCQkJTWFpbi50b3RhbENhbGN1bGF0aW9ucy5pbmNyZW1lbnRBbmRHZXQoKTsKCQl9Cgl9CgoJcHJpdmF0ZSBsb25nIGN1cnJlbnRWYWx1ZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJcHJpdmF0ZSBpbnQgeG9yU2hpZnRSYW5kb20oZmluYWwgaW50IG1heCkgewoJCWN1cnJlbnRWYWx1ZSBePSAoY3VycmVudFZhbHVlIDw8IDIxKTsKCQljdXJyZW50VmFsdWUgXj0gKGN1cnJlbnRWYWx1ZSA+Pj4gMzUpOwoJCWN1cnJlbnRWYWx1ZSBePSAoY3VycmVudFZhbHVlIDw8IDQpOwoJCWludCBvdXQgPSAoaW50KSBjdXJyZW50VmFsdWUgJSBtYXg7CgkJcmV0dXJuIChvdXQgPCAwKSA/IC1vdXQgOiBvdXQ7Cgl9Cn0=