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