Java 8 Executor вызывает вызывающий поток в качестве аргумента - PullRequest
0 голосов
/ 06 ноября 2019

Мне нужна помощь, чтобы запустить процесс в многопоточной среде (Java 8) параллельно, чтобы ускорить процесс. Вот мой вариант использования.

  1. Извлечение записей из базы данных (большое количество, миллионы записей), например: select * from EMP, где… ..and MOD (PK, totalLoops -1) = CurrentLoop LIMIT 10 000 (еще не принято)предел еще не установлен) - PostgreSQL DB
  2. Установите соединение с облачной платформой, прочитайте JSON, а затем проверьте данные из базы данных на ключи JSON и вернете проверенный или нет
  3. Обновите базу данных с состоянием проверки длякаждая запись извлечена выше.

Идея получения набора записей из базы данных и параллельного запуска процесса заключается в использовании значения 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();
...