Остальные параллельные вызовы службы - многопоточность в java - PullRequest
0 голосов
/ 18 июня 2020

У меня есть api вызова отдыха, где максимальное количество результатов, возвращаемых api, равно 1000.start page = 1

{"status": "OK", "payload": {"EMPList": [ ], count: 5665}

Итак, чтобы получить другой результат, мне нужно изменить начальную страницу = 2 и снова нажать на сервис. снова будет получено только 1000 результатов.

но после первого вызова i хочу сделать это как параллельный вызов, и я хочу собрать результат, объединить его и отправить обратно вызывающей службе в java. Пожалуйста, предложите, что я новичок в java. Я пробовал использовать вызываемый, но он не работает

1 Ответ

0 голосов
/ 18 июня 2020

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

// online runnable: https://ideone.com/47KsoS
int resultSize = 5;
int[] result = new int[resultSize*2];

Thread pg1 = new Thread(){
    public void run(){
        System.out.println("Thread 1 Running...");
        // write numbers 1-5 to indexes 0-4
        for(int i = 0 ; i < resultSize; i ++) {
            result[i] = i + 1;
        }
        System.out.println("Thread 1 Exiting...");
    }
};

Thread pg2 = new Thread(){
    public void run(){
        System.out.println("Thread 2 Running");
        // write numbers 5-10 to indexes 5-9
        for(int i = 0 ; i < resultSize; i ++) {
            result[i + resultSize] = i + 1 + resultSize;
        }
        System.out.println("Thread 2 Exiting...");
    }
};

pg1.start();
pg2.start();

// ensure that pg1 execution finishes
pg1.join();
// ensure that pg2 execution finishes
pg2.join();

// print result of reduction operation
System.out.println(Arrays.toString(result));

Однако с этой реализацией есть очень важное предостережение. Вы заметите, что оба потока НЕ ​​перекрываются при записи в память. Это очень важно, так как если бы вы просто изменили наш int[] result на ArrayList<Integer>, это могло бы привести к катастрофическому c сбою в нашей операции сокращения между двумя потоками, называемой Race Condition (я считаю, что стандартная реализация ArrayList в Java не является потокобезопасной). Поскольку мы можем гарантировать, насколько велик будет наш результат, я настоятельно рекомендую придерживаться своего использования массива для этой многопоточной реализации, поскольку списки ArrayLists скрывают от вас множество логических c реализаций, которые вы, вероятно, не поймете, пока не возьмете базовый курс c структуры данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...