Мне нужна помощь, чтобы запустить процесс в многопоточной среде (Java 8) параллельно, чтобы ускорить процесс. Вот мой вариант использования.
- Извлечение записей из базы данных (большое количество, миллионы записей), например: select * from EMP, где… ..and MOD (PK, totalLoops -1) = CurrentLoop LIMIT 10 000 (еще не принято)предел еще не установлен) - PostgreSQL DB
- Установите соединение с облачной платформой, прочитайте JSON, а затем проверьте данные из базы данных на ключи JSON и вернете проверенный или нет
- Обновите базу данных с состоянием проверки длякаждая запись извлечена выше.
Идея получения набора записей из базы данных и параллельного запуска процесса заключается в использовании значения MOD, а идентификатор потока будет заменен на «?» в запросе. ,Ex MOD (id, ThreadID) = Thread -1
Q1. Проблема в том, что я не могу передать идентификатор потока в качестве аргумента в Runnable или Callable. Q2. Могу ли я также использовать stream и forEach для вызова ArrayList - process.getGCPDataFromJSON ();Я могу перегрузить этот метод. Возможно ли иметь поток и потоковую передачу внутри потока и иметь несколько потоков?
private int totalNumberOfThreads = 10;
Callable<String> callableTask = () -> {
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("Current time :: " + LocalDateTime.now());
for (int i=0; i<10; i++{
process.getGCPDataFromJSON(ArrayList queryDataList =
DataAccess.getInstance().getDataToProcess(i, totalNumberOfThreads));
}
return “Done”
};
//Executor service instance
ExecutorService executor = Executors.newFixedThreadPool(2);
//2. execute individual tasks using submit() method
Set<Callable<String>> callables = new HashSet<Callable<String>>();
for (int i =0; i<10; i++){
executor.submit(callableTask);
callables.add(new Callable<String>() {
@Override
public String call() throws Exception {
return "Task Done:";
}
});
}
String result = executor.invokeAny(callables);
System.out.println("result = " + result);
//Shut down the executor service
executor.shutdownNow();