Понимание параллелизма Java с потоком

В настоящее время я читаю учебник по параллелизму Java в http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html

Я не мог понять, какие следующие строки в разделе «Подкласс или Runnable?»

Когда Runnable выполняется пулом потоков, легко поставить экземпляры Runnable в очередь до тех пор, пока поток из пула не будет бездействовать.


person darkapple    schedule 17.04.2011    source источник


Ответы (4)


Как указано в статье, они оба «работают», хотя в целом вы должны использовать Runnable (или, если требуются аргументы/результат, Callable с Future), а не создавать подклассы Thread. Как вы заметили, это более гибко - оно отделяет то, что выполняется, от того, кто его выполняет. Расширение потока излишне тесно связывает эти две концепции в одном экземпляре, нарушая принцип объектно-ориентированного программирования единой ответственности. .

Иногда вам придется реализовывать исполняемый код как подкласс Thread, когда ваша рука вынуждена работать с API. Например, среда выполнения.addShutdownHook(Thread) требует, чтобы ваш код, который будет выполняться при завершении работы, был зарегистрирован как экземпляр Thread. Но если вы не имеете дело с одним из этих конкретных случаев, всегда используйте Runnable.

person mdma    schedule 17.04.2011

Автор просто хочет донести, что, по его мнению, Runnables проще использовать с пулами потоков. Концепция пула потоков заключается в том, что у вас может быть фиксированное количество потоков (скажем, 10), ожидающих выполнения заданий. Если все 10 из них заняты выполнением потоков, незавершенная работа может быть поставлена ​​в очередь до тех пор, пока один из этих потоков из пула не освободится.

person dreamer13134    schedule 17.04.2011
comment
Итак, если у нас есть фиксированное количество потоков для выполнения заданий, в чем разница между использованием расширенного потока Thread и потоков, реализованных в Runnable. - person darkapple; 17.04.2011
comment
проверьте это: coderanch.com/how-to/java/ExtendingThreadVsImplementingRunnable Итоговая строка : реализуя Runnable, а не расширяя Thread, вы минимизируете объем кода, который вам, возможно, придется изменить позже, если вы решите использовать Executor. - person dreamer13134; 17.04.2011
comment
и ofcorse, исполнители и все новые хорошие вещи работают с Runnables..... На мой взгляд, вам не нужно беспокоиться о потоках для простого, прямого приложения после J5 - person dreamer13134; 17.04.2011

Дженков подчеркивает, что выбор между реализацией Subclass или Runnable обусловлен предпочтением, если что-то еще.

Он ссылается на шаблон пула потоков в качестве примера того, почему реализация запускаемого интерфейса более гибкая. Я поддерживаю его первоначальную гипотезу, но главным образом потому, что объект Runnable может быть подклассом класса, отличного от Thread.

Я не совсем понимаю, как создание пулов потоков было бы это более громоздким с подклассами потоков с собственными библиотеками java, т.е. java.util.concurrent.ThreadPoolExecutor . Хотел бы я, чтобы Дженков привел пример...

person Community    schedule 17.04.2011
comment
Проблема в том, что каждый объект Thread на самом деле является новым потоком Java (который чаще всего соответствует собственному потоку). Смысл пулов потоков в том, чтобы избежать создания новых потоков, если в этом нет необходимости, так как это довольно дорого. - person Paŭlo Ebermann; 17.04.2011

Дженков идет дальше в своем руководстве по параллелизму, чтобы описать фиксированные и кэшированные пулы потоков с использованием фабричных методов ExecutorService. Посмотрите здесь: http://tutorials.jenkov.com/java-util-concurrent/executorservice.html. С утилитами параллелизма Java, которые создают эти пулы потоков, использование runnables упрощается.

person swingMan    schedule 09.04.2015