Java - ThreadPool ждет завершения задачи

Я сделал ThreadPool на Java. Я использую его следующим образом.

public Image calculateObject() {
    Image img;

    Task task = new Task() {
        @Override
        protected Object call() throws Exception {
            //Calculate the Image.
        }
    }
    threadPool.addTask(task);
    //Wait for task completion.
    return img;
}

Очевидно, я хочу дождаться, пока ThreadPool выполнит задачу и создаст Object, прежде чем я вернусь из функции. Как мне это сделать, должен ли я реализовать какую-то функцию wait в моем ThreadPool (как мне это сделать?)? Я полностью неправильно понял смысл ThreadPool и веду себя глупо?

Чтобы уточнить, основная задача моего ThreadPool - сделать ProgressBar для всех поступающих Task, а также убедиться, что важные Task будут заполнены первыми.

Обновлено: Итак, как указал HoverCraftFullOfEels, мой вопрос на самом деле довольно глупый. Постараюсь прояснить проблему дальше. Итак, я хочу создать функцию, которая запустит Thread, вычислит Image и вернет его, когда закончите. Создание изображения может занять до 10 минут, и я хочу иметь возможность создавать несколько одновременно, но с немного разными параметрами. Я также не хочу, чтобы графический интерфейс зависал, когда это происходит. Когда эта функция завершится, я хочу вернуть завершенный Image, чтобы его можно было сохранить.

Можно ли вместо этого сделать эту функцию на Task, и каждый раз, когда я хочу создать Image, я запускаю задачу? Как мне тогда получить этот Image от ThreadPool?

Ваше утверждение «очевидно» предполагает, что вы не понимаете, как работает многопоточность и почему и когда использовать многопоточность. Если вы хотите, чтобы метод ждал, вам вообще не следует использовать поток. Если вы хотите использовать многопоточность, то ждите метод не могу. Период. Вы захотите использовать какое-то уведомление, например механизм обратного вызова. В библиотеке Java Concurrency есть механизмы обратного вызова, которые вы, возможно, захотите изучить.

Hovercraft Full Of Eels 07.07.2018 01:11

@HovercraftFullOfEels, это очень хороший момент. Постараюсь прояснить свою проблему дальше.

Ivar Eriksson 07.07.2018 01:12

@HovercraftFullOfEels, не могли бы вы проверить мой Редактировать?

Ivar Eriksson 07.07.2018 01:23

Страница, на которую ссылается @HovercraftFullOfEels, рассказывает о Future, который возвращается, когда вы отправляете свой Task в пул потоков. Если вы определяете свой Task как Callable<Image>, то будущее становится Future<Image>, и вы можете вызвать future.get(0, TimeUnit.MILLISECONDS), который вернет Image, выдаст тайм-аут или другое исключение. Вот как вы можете возвращать значения из ваших потоков.

Gray 07.07.2018 01:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
27
0

Другие вопросы по теме