import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
@SuppressWarnings("javadoc")
class Reactive {
private static final AtomicInteger threadId = new AtomicInteger(0);
Thread t
= new Thread(r,
"RxComputationThreadPool-" + threadId.
incrementAndGet()); t.setDaemon(true);
return t;
}
private static ExecutorService pool = Executors.newCachedThreadPool(Reactive::threadFactory);
List
<Callable
<String
>> tasks
= Arrays.
asList( () -> "One: " + Thread.
currentThread().
getName(),
() -> "Two: " + Thread.
currentThread().
getName(),
() -> "Three: " + Thread.
currentThread().
getName() );
CompletionService<String> completor = new ExecutorCompletionService<>(pool);
int count = tasks.size();
tasks.stream().forEach(completor::submit);
for (int i = 0; i < count; i++) {
System.
out.
println("Received: " + completor.
take().
get() + " at " + Thread.
currentThread().
getName()); }
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGlvblNlcnZpY2U7CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvckNvbXBsZXRpb25TZXJ2aWNlOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CgoKQFN1cHByZXNzV2FybmluZ3MoImphdmFkb2MiKQpjbGFzcyBSZWFjdGl2ZSB7CiAgICAKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgdGhyZWFkSWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKICAgIAogICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkIHRocmVhZEZhY3RvcnkoUnVubmFibGUgcikgewogICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChyLCAiUnhDb21wdXRhdGlvblRocmVhZFBvb2wtIiArIHRocmVhZElkLmluY3JlbWVudEFuZEdldCgpKTsKICAgICAgICB0LnNldERhZW1vbih0cnVlKTsKICAgICAgICByZXR1cm4gdDsKICAgIH0KICAgIAogICAgcHJpdmF0ZSBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIHBvb2wgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChSZWFjdGl2ZTo6dGhyZWFkRmFjdG9yeSk7CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKICAgICAgICBMaXN0PENhbGxhYmxlPFN0cmluZz4+IHRhc2tzID0gQXJyYXlzLmFzTGlzdCgKICAgICAgICAgICAgICAgICgpIC0+ICJPbmU6ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICgpIC0+ICJUd286ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICgpIC0+ICJUaHJlZTogIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpCiAgICAgICAgICAgICk7CiAgICAgICAgCiAgICAgICAgQ29tcGxldGlvblNlcnZpY2U8U3RyaW5nPiBjb21wbGV0b3IgPSBuZXcgRXhlY3V0b3JDb21wbGV0aW9uU2VydmljZTw+KHBvb2wpOwogICAgICAgIAogICAgICAgIGludCBjb3VudCA9IHRhc2tzLnNpemUoKTsKICAgICAgICB0YXNrcy5zdHJlYW0oKS5mb3JFYWNoKGNvbXBsZXRvcjo6c3VibWl0KTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZDogIiArIGNvbXBsZXRvci50YWtlKCkuZ2V0KCkgKyAiIGF0ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CiAgICAgICAgfQogICAgICAgIAogICAgfQoKfQo=