Многопоточность в среде Java* - Intel Software NetworkIntel.ruДругие страныО корпорации IntelКонференц-залКонтактыSearchГлавная страницаВыбор языкаПожалуйста, выберитеEnglish简体中文РусскийИнструменты и ресурсыПримеры кода и файлы для загрузкиИнструменты разработки ПОЦентр ресурсовОткрытые исходные кодыПодкастыОбучениеПоддержкаТехническая литература издательства Intel PressПроект What If SoftwareСообществаМобильностьУправляемостьМногоядерностьГрафикаДискуссии и мненияФорумыБлогиБаза знаний WikiВидеороликиПримите участие в мероприятияхПрограммыПартнерская программа Intel Software PartnerПрофессиональные услугиСлужба удаленного доступа IntelРегистрацияВходРегистрацияГлавная страница› Сеть Intel Software Network› Центры разработчиков › Семейство процессоров Itanium ›Многопоточность в среде Java*Опции страницы ||Сделать закладку |СодержаниеМногопоточность в среде Java*Организация многопоточности в коде JavaРеализация многопоточностиИспользование пулов потоковЗаключениеСправочные материалы и дополнительные ресурсыОб автореПроголосоватьтеги сообществаTag ThisМои тегиSite Tag CloudПоиск тегов Реализация многопоточностиМногопоточность, которую организуют для повышения производительности, значительно усложняет программный код, особенно если необходимо предусмотреть взаимодействие потоков. Важно разобраться с премудростями организации потоков, так как чем больше ядер в процессорах Intel, тем больше потоков приходится предусматривать в программном коде. Недостаточная компетенция разработчика при организации многопоточности несомненно приведет к возникновению множества ошибок в программе, поэтому давайте перейдем к рассмотрению решений некоторых возможных сложностей.Ожидание завершения другого потока: Предположим, нам нужно обработать целочисленный массив. Это можно делать последовательно, обрабатывая одно значение массива за другим, или, что более продуктивно, параллельно – созданием нескольких потоков, каждому из которых назначена определенная область массива. Допустим, чтобы перейти к следующей стадии обработки, нам необходимо дождаться завершения всех потоков. Для синхронизации взаимодействия потоков используется метод join(). При его задействовании запуск определенного потока произойдет после завершения другого. Таким образом, поток В будет ждать завершения потока А. При превышении времени ожидания, назначенного в методе join(), поток В займется обработкой других данных, если поток А еще не завершен. Итак, мы обсудили самую сложную задачу при организации многопоточности – проблему ожидания завершения потоков. Вернемся к ней позже.Ожидание доступа к заблокированным объектам: Предположим, мы занимаемся разработкой системы бронирования билетов для аэропорта. Чаще всего многопоточность в таких программах организована таким образом, что каждому подключенному к системе пользователю, а также всем кассирам назначены отдельные потоки (организация очень больших систем может отличаться от описанной). Если два пользователя одновременно попытаются забронировать одно и то же место, а в программе эта возможность не предусмотрена, произойдет следующее: один поток обратится к конкретному ресурсу одновременно с другим потоком. В результате оба пользователя решат, что они забронировали себе нужный билет на самолет.Для того чтобы предотвратить изменение одних и тех же данных разными потоками, необходимо, чтобы один поток заблокировал доступ к ним для другого потока. Тогда при попытке второго потока изменить данные, ему придется ждать, пока первый поток не снимет свою блокировку. В нашем примере второй поток обнаружит, что данное место уже было зарезервировано, и выдаст соответствующее предупреждение пользователю. Ситуация, описанная выше, называется "состоянием гонки" (race condition), и ее последствия могут быть очень пагубными. Вот почему на время выполнения операций с данными одним потоком принято блокировать доступ к этим данным для других потоков.В среде Java блокировку можно реализовать несколькими способами. Наиболее частым является использование ключевого слова "synchronized". Метод, содержащий это ключевое слово, может выполняться только одним потоком, а после выполнения метода блокировка снимается. Рассмотрим пример: protected synchronized int reserveSeat ( Seat seat_number ) { if ( seat_number.getReserved() == false ) { seat_number.setReserved(); return ( 0 ); } else return ( -1 ); } В данном случае одновременное выполнение метода несколькими потоками невозможно – состояние гонки предотвращено блокировкой.Использование синхронизации – не единственный метод организации взаимодействия потоков. В среде Java версии J2SE* 5.0 доступно еще несколько удобных способов блокировки. Большинство из них находятся в пакете java.util.concurrent.locks, который стоит внимательно изучить для уверенной работы с потоками в среде Java.Как отмечалось выше, механизмы блокировки помогают предотвратить состояние гонки, но с ними связано еще несколько проблем, например, тупиковая ситуация (deadlock). Она заключается в следующем: предположим, поток А ожидает завершения потока В, который, в свою очередь, ожидает завершения потока А. Таким образом, оба потока будут всегда заблокированы. Возможность образования тупиковых ситуаций трудно предугадать, поэтому очень важно, чтобы между потоками не было зависимостей подобного рода.Предыдущая1 2 3 4 5 СледующаяСтраница 3 из 7 We invite you to post a comment (not monitored by customer support) on this page or send a question directly to our support team.Карта сайтаRSSРабота в IntelСвязь с инвесторами*Правовая информацияКонфиденциальностьIntel Corporation zip lock vps vds -40 cata