Как использовать несколько Executor Service в одном методе.? - PullRequest
0 голосов
/ 29 декабря 2018

Вот мой пример, но он не выполняется.Правильно работает только для моего первого пула потоков, но второй пул потоков не был запущен.Это правильный путь или нет, если это правильно, где я ошибаюсь, если это не так, как я реализую несколько исполнителей службы.В моем примере сохранение API выполнено успешно, но метод назначения книги назначен успешно, но после того, как Книга API не выполнена, мне интересно это поведение

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyTestClass {

    public static void main(String args[]) {
        //Create class object
        MyTestClass  myObj = new MyTestClass();
        // Create List A
        List<String> a = new ArrayList<>();
        a.add("Test1");
        a.add("Test2");
        a.add("Test3");
        a.add("Test4");
        //Create List B
        List<String> b = new ArrayList<>();
        b.add("Test1");
        b.add("Test2");
        b.add("Test3");
        b.add("Test4");
        b.add("Test5");
        b.add("Test6");
        b.add("Test7");
        b.add("Test3");
        b.add("Test4");
        b.add("Test5");
        b.add("Test6");
        b.add("Test7");
        //Call my method
        myObj.myMethod(a, b);

    }
    //Multi-threading example in appointment book method execute first api but its not called the second api
    void myMethod(List<String> listA, List<String> listB){
        ExecutorService threadPool = Executors.newFixedThreadPool(listA.size());
            List<Callable<Object>> tasks = new ArrayList<>();
            for (String strA : listA) {
                tasks.add(Executors.callable(new Thread() {
                    @Override
                    public void run() {
                        processA(strA);     
            }
                }));
            }
            try {
                //Execute first thread pool for save
                threadPool.invokeAll(tasks);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
                System.out.println("Error while running threads");
            }
            threadPool.shutdown();
            //Call book appointment api
            bookAppointMent(listB);

    }

    //Book appointment
    void bookAppointMent(List<String> listB) {
         ExecutorService threadPool2 = Executors.newFixedThreadPool(listB.size());
            List<Callable<Object>> tasks2 = new ArrayList<>();
            for (String strB : listB) {
                tasks2.add(Executors.callable(new Thread() {
                    @Override
                    public void run() {
                       // Add task
                        processB(strB);     
            }
                }));
            }
            try {
                //Execute thread pool2
                threadPool2.invokeAll(tasks2);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
                System.out.println("Error while running threads");
            }
             //Shutdown pool-2
            threadPool2.shutdown();

    }

    //Save appointment
    public void processA(String a){
        //Here its save API
        System.out.println("Save A successfully...." + a);
    }

    //Book Appointment In this method only first api called but second one is not called
    public void processB(String b){
        //Here is First API call - This only called
        System.out.println("Appointment booked successfully...." + b);
        //Here is second API call - Its not called
        processAfterAppBooked(b);
    }

    //Process after book app
    public void processAfterAppBooked(String b) {
        //Second api call - its not execute
        System.out.println("After appointment booked " + b);
    }
}
...