Удалить блокировку из метода - PullRequest
7 голосов
/ 11 февраля 2011

Это домашнее задание.

Я не хочу решения, просто небольшое количество ссылок или идей.

Проще говоря, я хочу сделать,

Простой пример:

public class Example
{
    public void method()
    {
           int x = doThat();
           //Call other methods which do not depend on x
           return;
    }
}

doThat() - это метод, который, как известно, отнимает много времени, в результате чего моя программа блокируется до тех пор, пока результаты не вернутся. И я хочу использовать разные методы этого объекта, но программа frozen, пока doThat() не закончится. Эти разные методы не обязательно должны вызываться из method(), использованного в этом примере, но, возможно, извне объекта.

Я думал об использовании потоков, но если у меня огромное количество объектов (1000+), это, вероятно, не будет очень эффективным (поправьте меня, если я ошибаюсь, пожалуйста). Я думаю, если я использую потоки, я должен использовать один поток на объект?

Есть ли другой способ, кроме потоков, который может заставить вызывающий объект не блокироваться при вызове doThat();? Если потоковая передача является единственным способом, не могли бы вы предоставить ссылку?

Зная, что подобные вопросы получают отрицательный голос, я принимаю любые отрицательные голоса. Но, пожалуйста, просто ссылка будет более чем здорово.

Заранее спасибо. Я надеюсь, что вопрос соответствует правилам.

Ответы [ 4 ]

3 голосов
/ 11 февраля 2011

Я бы также использовал потоки для этого, но я просто хотел добавить, что, вероятно, было бы интересно взглянуть на java.util.concurrent.Executors (для создания пулов потоков, когда у вас есть несколько объектов) и java.util.concurrent.Future и java.util.concurrent.Callable классы, которые позволят вам запускать потоки, которые могут возвращать значение.

Для получения дополнительной информации ознакомьтесь с руководством по параллелизму .

1 голос
/ 11 февраля 2011

Вы хотите выполнять несколько вещей одновременно, поэтому использование потоков - действительно лучший способ. Учебный урок параллелизма по Java , вероятно, поможет вам.

1000 параллельных потоков приведет к большой загрузке памяти, поскольку для каждого потока выделено определенное количество стековой памяти (2 МБ?).Однако, если вы можете каким-то образом убедиться, что одновременно будет работать только один поток, вы все равно можете использовать поток для каждого объекта.Это потребовало бы, чтобы вы управляли вызовом doThat() только в том случае, если поток, созданный предыдущим вызовом для другого объекта, уже завершен.

Если вы не можете обеспечить это легко, другой подход будет состоять в его создании.рабочий поток, который читает из двусторонней очереди , над каким объектом работать.Затем метод doThat() просто добавит this в конец очереди, из которого рабочий поток впоследствии извлечет его.Вы должны правильно синхронизировать при доступе к любой структуре данных из параллельных потоков.И основной поток должен как-то уведомить рабочий поток об условии, что он не будет добавлять больше объектов в очередь, чтобы рабочий поток мог без проблем завершиться.

1 голос
/ 11 февраля 2011

Конечно, потоки - это единственное решение для обработки некоторых заданий в фоновом режиме, но вы не обязаны использовать поток только для выполнения одной операции.Вы можете использовать только один поток, который поддерживает очередь операций, которые будут выполняться таким образом, чтобы при каждом вызове метода doThat добавлялась новая запись в очередь.Возможно, некоторые шаблоны проектирования, такие как «Стратегия», могут помочь вам обобщить концепцию выполняемой операции, чтобы сохранить «объекты операции» в очереди потока.

1 голос
/ 11 февраля 2011

Я рекомендую вам создать класс, который реализует Runnable, чей метод run делает то же, что и doThat() в вашем примере.Затем вы можете вызвать его в отдельном потоке простым способом.Java Thread class имеет конструктор, который принимает runnable.Используйте методы run и join.

Cheers Matthias

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...