ExecutorService FixedThreadPool as a shared parameter not running in parallel












1














I am trying to use fixed thread pool in Java 8 which works perfect as long as it stays within the same function. Once I try sharing the executor as a parameter, it never runs in parallel.



This works great:



```



public static void test2() {

ExecutorService executor = Executors.newFixedThreadPool(2);
try {
CompletionService<Integer> myCompletionService =
new ExecutorCompletionService<Integer>(executor);


myCompletionService.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 123;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});


CompletionService<Integer> myCompletionService2 =
new ExecutorCompletionService<Integer>(executor);
myCompletionService2.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 654;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});

Future<Integer> myFuture = myCompletionService.take();
Integer x = myFuture.get();
System.out.println("Result = " + x);

Future<Integer> myFuture2 = myCompletionService2.take();
Integer y = myFuture2.get();
System.out.println("Result = " + y);

executor.shutdown();
} catch (InterruptedException | ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
```


But once I move these into three functions like:



```



static Integer t1(ExecutorService executor) throws InterruptedException, ExecutionException {
CompletionService<Integer> myCompletionService =
new ExecutorCompletionService<Integer>(executor);


myCompletionService.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 123;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});
Future<Integer> myFuture = myCompletionService.take();
return myFuture.get();
}

static Integer t2(ExecutorService executor) throws InterruptedException, ExecutionException {
CompletionService<Integer> myCompletionService2 =
new ExecutorCompletionService<Integer>(executor);


myCompletionService2.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 456;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});
Future<Integer> myFuture2 = myCompletionService2.take();
return myFuture2.get();
}

static void test3() {
ExecutorService executor = Executors.newFixedThreadPool(5);
try {
Integer x = t1(executor);
Integer y = t2(executor);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
executor.shutdown();
}


```
Now test3 will take 10 seconds, where I expected it to be the same as the top one which should take 5 seconds if things are running in parallel.,










share|improve this question






















  • The entire use of CompletionService is obsolete here. You can call submit directly on the ExecutorService and it returns the Future.
    – Holger
    Nov 21 '18 at 7:58
















1














I am trying to use fixed thread pool in Java 8 which works perfect as long as it stays within the same function. Once I try sharing the executor as a parameter, it never runs in parallel.



This works great:



```



public static void test2() {

ExecutorService executor = Executors.newFixedThreadPool(2);
try {
CompletionService<Integer> myCompletionService =
new ExecutorCompletionService<Integer>(executor);


myCompletionService.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 123;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});


CompletionService<Integer> myCompletionService2 =
new ExecutorCompletionService<Integer>(executor);
myCompletionService2.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 654;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});

Future<Integer> myFuture = myCompletionService.take();
Integer x = myFuture.get();
System.out.println("Result = " + x);

Future<Integer> myFuture2 = myCompletionService2.take();
Integer y = myFuture2.get();
System.out.println("Result = " + y);

executor.shutdown();
} catch (InterruptedException | ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
```


But once I move these into three functions like:



```



static Integer t1(ExecutorService executor) throws InterruptedException, ExecutionException {
CompletionService<Integer> myCompletionService =
new ExecutorCompletionService<Integer>(executor);


myCompletionService.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 123;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});
Future<Integer> myFuture = myCompletionService.take();
return myFuture.get();
}

static Integer t2(ExecutorService executor) throws InterruptedException, ExecutionException {
CompletionService<Integer> myCompletionService2 =
new ExecutorCompletionService<Integer>(executor);


myCompletionService2.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 456;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});
Future<Integer> myFuture2 = myCompletionService2.take();
return myFuture2.get();
}

static void test3() {
ExecutorService executor = Executors.newFixedThreadPool(5);
try {
Integer x = t1(executor);
Integer y = t2(executor);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
executor.shutdown();
}


```
Now test3 will take 10 seconds, where I expected it to be the same as the top one which should take 5 seconds if things are running in parallel.,










share|improve this question






















  • The entire use of CompletionService is obsolete here. You can call submit directly on the ExecutorService and it returns the Future.
    – Holger
    Nov 21 '18 at 7:58














1












1








1


1





I am trying to use fixed thread pool in Java 8 which works perfect as long as it stays within the same function. Once I try sharing the executor as a parameter, it never runs in parallel.



This works great:



```



public static void test2() {

ExecutorService executor = Executors.newFixedThreadPool(2);
try {
CompletionService<Integer> myCompletionService =
new ExecutorCompletionService<Integer>(executor);


myCompletionService.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 123;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});


CompletionService<Integer> myCompletionService2 =
new ExecutorCompletionService<Integer>(executor);
myCompletionService2.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 654;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});

Future<Integer> myFuture = myCompletionService.take();
Integer x = myFuture.get();
System.out.println("Result = " + x);

Future<Integer> myFuture2 = myCompletionService2.take();
Integer y = myFuture2.get();
System.out.println("Result = " + y);

executor.shutdown();
} catch (InterruptedException | ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
```


But once I move these into three functions like:



```



static Integer t1(ExecutorService executor) throws InterruptedException, ExecutionException {
CompletionService<Integer> myCompletionService =
new ExecutorCompletionService<Integer>(executor);


myCompletionService.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 123;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});
Future<Integer> myFuture = myCompletionService.take();
return myFuture.get();
}

static Integer t2(ExecutorService executor) throws InterruptedException, ExecutionException {
CompletionService<Integer> myCompletionService2 =
new ExecutorCompletionService<Integer>(executor);


myCompletionService2.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 456;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});
Future<Integer> myFuture2 = myCompletionService2.take();
return myFuture2.get();
}

static void test3() {
ExecutorService executor = Executors.newFixedThreadPool(5);
try {
Integer x = t1(executor);
Integer y = t2(executor);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
executor.shutdown();
}


```
Now test3 will take 10 seconds, where I expected it to be the same as the top one which should take 5 seconds if things are running in parallel.,










share|improve this question













I am trying to use fixed thread pool in Java 8 which works perfect as long as it stays within the same function. Once I try sharing the executor as a parameter, it never runs in parallel.



This works great:



```



public static void test2() {

ExecutorService executor = Executors.newFixedThreadPool(2);
try {
CompletionService<Integer> myCompletionService =
new ExecutorCompletionService<Integer>(executor);


myCompletionService.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 123;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});


CompletionService<Integer> myCompletionService2 =
new ExecutorCompletionService<Integer>(executor);
myCompletionService2.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 654;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});

Future<Integer> myFuture = myCompletionService.take();
Integer x = myFuture.get();
System.out.println("Result = " + x);

Future<Integer> myFuture2 = myCompletionService2.take();
Integer y = myFuture2.get();
System.out.println("Result = " + y);

executor.shutdown();
} catch (InterruptedException | ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
```


But once I move these into three functions like:



```



static Integer t1(ExecutorService executor) throws InterruptedException, ExecutionException {
CompletionService<Integer> myCompletionService =
new ExecutorCompletionService<Integer>(executor);


myCompletionService.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 123;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});
Future<Integer> myFuture = myCompletionService.take();
return myFuture.get();
}

static Integer t2(ExecutorService executor) throws InterruptedException, ExecutionException {
CompletionService<Integer> myCompletionService2 =
new ExecutorCompletionService<Integer>(executor);


myCompletionService2.submit(()-> {
try {
TimeUnit.SECONDS.sleep(5);
return 456;
}
catch (InterruptedException e) {
throw new IllegalStateException("task interrupted", e);
}
});
Future<Integer> myFuture2 = myCompletionService2.take();
return myFuture2.get();
}

static void test3() {
ExecutorService executor = Executors.newFixedThreadPool(5);
try {
Integer x = t1(executor);
Integer y = t2(executor);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
executor.shutdown();
}


```
Now test3 will take 10 seconds, where I expected it to be the same as the top one which should take 5 seconds if things are running in parallel.,







java java-8 threadpool






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 20 '18 at 21:47









Mohy Eldeen

648619




648619












  • The entire use of CompletionService is obsolete here. You can call submit directly on the ExecutorService and it returns the Future.
    – Holger
    Nov 21 '18 at 7:58


















  • The entire use of CompletionService is obsolete here. You can call submit directly on the ExecutorService and it returns the Future.
    – Holger
    Nov 21 '18 at 7:58
















The entire use of CompletionService is obsolete here. You can call submit directly on the ExecutorService and it returns the Future.
– Holger
Nov 21 '18 at 7:58




The entire use of CompletionService is obsolete here. You can call submit directly on the ExecutorService and it returns the Future.
– Holger
Nov 21 '18 at 7:58












1 Answer
1






active

oldest

votes


















2














In t1 after submitting you are calling get() and get blocked, so you exit from t1 only when first task is finished (after 5 secs).



In first example you submit both tasks so they starting executing in separate threads and then only call get() to block and wait for result.






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53402069%2fexecutorservice-fixedthreadpool-as-a-shared-parameter-not-running-in-parallel%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    2














    In t1 after submitting you are calling get() and get blocked, so you exit from t1 only when first task is finished (after 5 secs).



    In first example you submit both tasks so they starting executing in separate threads and then only call get() to block and wait for result.






    share|improve this answer


























      2














      In t1 after submitting you are calling get() and get blocked, so you exit from t1 only when first task is finished (after 5 secs).



      In first example you submit both tasks so they starting executing in separate threads and then only call get() to block and wait for result.






      share|improve this answer
























        2












        2








        2






        In t1 after submitting you are calling get() and get blocked, so you exit from t1 only when first task is finished (after 5 secs).



        In first example you submit both tasks so they starting executing in separate threads and then only call get() to block and wait for result.






        share|improve this answer












        In t1 after submitting you are calling get() and get blocked, so you exit from t1 only when first task is finished (after 5 secs).



        In first example you submit both tasks so they starting executing in separate threads and then only call get() to block and wait for result.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 20 '18 at 21:53









        art

        717




        717






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53402069%2fexecutorservice-fixedthreadpool-as-a-shared-parameter-not-running-in-parallel%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Create new schema in PostgreSQL using DBeaver

            Deepest pit of an array with Javascript: test on Codility

            Costa Masnaga