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




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