Прежде всего
Обычный отказ от ответственности: параллельное программирование на любом языке с использованием любого уровня абстракции является сложным и сложным и сопряжено со многими рисками. Примите во внимание:
- Параллельное программирование усложняет любое приложение по величине
- Юнит-тестирование критических секций сложно, а иногда и невозможно
- Воспроизведение ошибок, возникающих в параллельном коде, очень сложно и сильно зависит от архитектуры, версии ОС, версии и т. Д. *
Параллельные API Java
Java прошла долгий путь, чтобы сделать параллельное программирование как можно более простым для разработчиков. В большинстве случаев вы увидите, что java.util.concurrent
содержит большинство необходимых вам абстракций:
Runnable
интерфейс и Thread
объект, который вы можете расширить. Просто добавьте свой код, и у вас есть готовый поток для запуска
- Хороший набор
Executors
: постоянный пул, динамический пул, запланированный или любой другой. Просто бросьте Runnable
в него, и он сделает все остальное.
Semaphore
s и блокировки всех видов избавят вас от необходимости применять общие методы блокировки.
- Встроенный
wait()
и notify()
API для всех объектов.
Использует
Вам, инженеру-программисту, остается только убедиться, что вы пишете правильный код. Это означает, что вы должны знать об опасных ситуациях, которым вы можете подвергаться:
- Deadlock - ситуация, когда два или более потоков ожидают неупорядоченных ресурсов, создавая бесконечный цикл ожидания.
- Livelock - два или более потоков, которые вежливо пытаются уступить другому на общем ресурсе, но в итоге не берут его (представьте, что два человека в коридоре подходят друг к другу и постоянно движутся вместе) из стороны в сторону)
- Голодание - один поток занимает большую часть или весь общий ресурс, что лишает другие потоки доступа к нему.
Основная точка (или, когда использовать)
Используйте потоки только тогда, когда параллелизм непосредственно улучшит поведение ваших приложений.
Если вы ожидаете ресурсов ввода-вывода / сети / оборудования, DO создает поток для него, чтобы вы могли продолжать выполнять другие действия.
Если вы просто пытаетесь элегантно разделить вычисления, связанные с ЦП, НЕ используйте потоки. Вы можете просто ухудшить свою производительность.
Если вы используете потоки, убедитесь, что вы тщательно продумали риски и проверили трижды, чтобы не пропустить ни одной исключительной ситуации.
Полезные (онлайн) ресурсы
Самый быстрый способ разобраться в этом состоит в изучении Sun параллелизма . Кроме этого, получите хорошую книгу.
Удачи:)