- 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