Exemples Java ExecutorService

Exemples Java ExecutorService

En Java, nous pouvons utiliserExecutorService pour créer un pool de threads et suivre la progression des tâches asynchrones avecFuture.

LesExecutorService acceptent les tâchesRunnable etCallable.

  1. Runnable - Retour nul, rien.

  2. Callable - Return a Future.

1. ExecutorService

1.1 A classic ExecutorService example to create a thread pool with 5 threads, submit two tasks, get the result from Future and also how to handle the exception.

ExecutorExample1.java

package com.example.concurrency.executor;

import java.util.concurrent.*;

public class ExecutorExample1 {

    public static void main(String[] args) {

        ExecutorService executor = Executors.newFixedThreadPool(5);

        // Runnable, return void, nothing, submit and run the task async
        executor.submit(() -> System.out.println("I'm Runnable task."));

        // Callable, return a future, submit and run the task async
        Future futureTask1 = executor.submit(() -> {
            System.out.println("I'm Callable task.");
            return 1 + 1;
        });

        /* Before Java 8
        executor.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("I'm Runnable task.");
            }
        });

        Future futureTask1 = executor.submit(new Callable() {
            @Override
            public Integer call() {
                System.out.println("I'm Callable task.");
                return 1 + 1;
            }
        });*/

        try {

            otherTask("Before Future Result");

            // block until future returned a result,
            // timeout if the future takes more than 5 seconds to return the result
            Integer result = futureTask1.get(5, TimeUnit.SECONDS);

            System.out.println("Get future result : " + result);

            otherTask("After Future Result");


        } catch (InterruptedException e) {// thread was interrupted
            e.printStackTrace();
        } catch (ExecutionException e) {// thread threw an exception
            e.printStackTrace();
        } catch (TimeoutException e) {// timeout before the future task is complete
            e.printStackTrace();
        } finally {

            // shut down the executor manually
            executor.shutdown();

        }

    }

    private static void otherTask(String name) {
        System.out.println("I'm other task! " + name);
    }
}

Sortie

I'm Runnable task.
I'm Callable task.
I'm other task! Before Future Result
Get future result : 2
I'm other task! After Future Result

2. invokeAll

2.1 We can also create a list of Callable tasks, and run them all with invokeAll

ExecutorExample2.java

package com.example.concurrency.executor;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ExecutorExample2 {

    public static void main(String[] args) {

        ExecutorService executor = Executors.newCachedThreadPool();

        List> listOfCallable = Arrays.asList(
                () -> 1,
                () -> 2,
                () -> 3);

        try {

            List> futures = executor.invokeAll(listOfCallable);

            int sum = futures.stream().map(f -> {
                try {
                    return f.get();
                } catch (Exception e) {
                    throw new IllegalStateException(e);
                }
            }).mapToInt(Integer::intValue).sum();

            System.out.println(sum);

        } catch (InterruptedException e) {// thread was interrupted
            e.printStackTrace();
        } finally {

            // shut down the executor manually
            executor.shutdown();

        }

    }

}

Sortie

6

Télécharger le code source