import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
class ProcessingChainElement implements Callable<String> {
private final Future<String> previous;
public ProcessingChainElement(Future<String> previousResult) {
previous = previousResult;
}
@Override
// prepare something that may take some time..
if (previous != null) {
result
= previous.
get() + " [" + System.
currentTimeMillis() + "]"; } else {
result
= "[" + System.
currentTimeMillis() + "]"; }
return result;
}
}
public class Main {
long start
= System.
currentTimeMillis();
ExecutorService executor = Executors.newFixedThreadPool(3);
Future<String> result1 = executor.submit(new ProcessingChainElement(null));
Future<String> result2 = executor.submit(new ProcessingChainElement(result1));
Future<String> result3 = executor.submit(new ProcessingChainElement(result2));
executor.shutdown();
logTime("submitting", start);
start
= System.
currentTimeMillis(); String result
= result3.
get(); logTime("getting result", start);
System.
out.
println("Result is: " + result
); }
private static void logTime
(String what,
long start
) { long end
= System.
currentTimeMillis(); long diff = end - start;
System.
out.
printf("[%s] took %4d ms%n", what, diff
); }
}
aW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwoKCmNsYXNzIFByb2Nlc3NpbmdDaGFpbkVsZW1lbnQgaW1wbGVtZW50cyBDYWxsYWJsZTxTdHJpbmc+IHsKICAgIHByaXZhdGUgZmluYWwgRnV0dXJlPFN0cmluZz4gcHJldmlvdXM7CiAgICBwdWJsaWMgUHJvY2Vzc2luZ0NoYWluRWxlbWVudChGdXR1cmU8U3RyaW5nPiBwcmV2aW91c1Jlc3VsdCkgewogICAgICAgIHByZXZpb3VzID0gcHJldmlvdXNSZXN1bHQ7CiAgICB9CiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTdHJpbmcgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIC8vIHByZXBhcmUgc29tZXRoaW5nIHRoYXQgbWF5IHRha2Ugc29tZSB0aW1lLi4KICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKICAgICAgICBTdHJpbmcgcmVzdWx0OwogICAgICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHByZXZpb3VzLmdldCgpICsgIiBbIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIl0iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCA9ICJbIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIl0iOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQp9CgpwdWJsaWMgY2xhc3MgTWFpbiB7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24gewogICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCiAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgzKTsKICAgICAgICBGdXR1cmU8U3RyaW5nPiByZXN1bHQxID0gZXhlY3V0b3Iuc3VibWl0KG5ldyBQcm9jZXNzaW5nQ2hhaW5FbGVtZW50KG51bGwpKTsKICAgICAgICBGdXR1cmU8U3RyaW5nPiByZXN1bHQyID0gZXhlY3V0b3Iuc3VibWl0KG5ldyBQcm9jZXNzaW5nQ2hhaW5FbGVtZW50KHJlc3VsdDEpKTsKICAgICAgICBGdXR1cmU8U3RyaW5nPiByZXN1bHQzID0gZXhlY3V0b3Iuc3VibWl0KG5ldyBQcm9jZXNzaW5nQ2hhaW5FbGVtZW50KHJlc3VsdDIpKTsKICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOwoKICAgICAgICBsb2dUaW1lKCJzdWJtaXR0aW5nIiwgc3RhcnQpOwoKICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgIFN0cmluZyByZXN1bHQgPSByZXN1bHQzLmdldCgpOwogICAgICAgIGxvZ1RpbWUoImdldHRpbmcgcmVzdWx0Iiwgc3RhcnQpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCBpczogIiArIHJlc3VsdCk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dUaW1lKFN0cmluZyB3aGF0LCBsb25nIHN0YXJ0KSB7CiAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICBsb25nIGRpZmYgPSBlbmQgLSBzdGFydDsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiWyVzXSB0b29rICU0ZCBtcyVuIiwgd2hhdCwgZGlmZik7CiAgICB9Cn0K