Итерация по потоку с l oop и обработка нескольких результатов - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь использовать потоки, чтобы моя программа выполняла некоторые части параллельно, и у меня возникают проблемы.

Цель - обработать список ссылок, urlList с помощью функции ImageProcessor().processLink. У меня есть две проблемы, которые я пытаюсь решить:

  1. Как мне это сделать oop, чтобы использовать N потоков в пуле, в данном случае 10? То есть я хочу обрабатывать 10 ссылок одновременно.
  2. Функция обработки выше возвращает File, который мне нужно добавить в массив, fileList. Что касается многопоточности, как я справлюсь с этим?

Это то, что у меня так далеко:

    ArrayList<String> urlList = new ArrayList<>(Arrays.asList(arr.split("\\r?\\n"))) ;
    ArrayList<File> fileList = new ArrayList<>();
    ExecutorService executor = Executors.newFixedThreadPool(10);

    //process the requested files
    for (int i = 0; i < urlList.size(); i++){
        Future<File> value = executor.submit(new Callable<File>() {
            @Override
            public File call(int i) throws IOException {
                return new ImageProcessor().processLink(urlList.get(i));
            }
        });

        try {
            fileList.add(value.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }

1 Ответ

0 голосов
/ 20 марта 2020

Получил работу со следующим:

    ArrayList<String> urlList = new ArrayList<>(Arrays.asList(arr.split("\\r?\\n"))) ;
    ArrayList<File> fileList = new ArrayList<>();

    ExecutorService executor = Executors.newFixedThreadPool(THREAD_SIZE);
    List<Future<File>> futures = new ArrayList<>();

    for (int i = 0; i < urlList.size(); i++) {
        ImageProcessor proc = new ImageProcessor(urlList.get(i));
        final Future<File> future = executor.submit(proc);
        futures.add(future);
    }

    try {
        executor.awaitTermination(5, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    for (int i = 0; i < futures.size(); i++)
    {
        Future<File> result = futures.get(i);
        try {
            fileList.add(result.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
    executor.shutdown();
    while (!executor.isTerminated()) { }
    System.out.println("Finished all threads");
...