Главная » Разработка для Android » ПАРАЛЛЕЛИЗМ В ANDROID

0

 

Мы уже упоминали о том, что правильно писать программы с параллельным исполнением задач может быть очень непросто. В библиотеках Android предлагаются удобные инструменты, позволяющие сделать параллелизм и проще, и безопаснее.

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

Многопоточные приложения Java появились задолго до того, как средний пользователь смог позволить себе машины с несколькими процессорами, на которых было бы удобно работать с такими приложениями. В мире Android многопоточность приобретает большое значение, хотя на протяжении ближайшего года или около того на многих устройствах будет стоять по одному процессору. Итак, в чем же польза от многопоточности, если не в ускорении работы программы?

Если вам сколь-нибудь долго доводилось заниматься программированием, то, полагаем, вы понимаете абсолютную важность того, что все команды вашего кода должны выполняться в жестком последовательном порядке. Выполнение любой отдельно взятой команды должно так или иначе происходить до выполнения следующей команды. Потоки – это просто явный способ смягчения этого правила. Потоки – это абстракции, которыми разработчики пользуются для того, чтобы можно было создавать и писать код, который будет упорядоченным, логичным и удобочитаемым, даже если воплощенные в нем задачи в реальности не являются упорядоченными.

Параллельное выполнение независимых потоков не приводит к неизбежному усложнению программы, если потоки действительно полностью независимы (например, если один из них работает на вашем компьютере, а другой – на моем). Но когда двум параллельным процессам приходится выполнять одну и ту же задачу, им требуется рандеву (точка для встречи и взаимодействия). Например, возможна ситуация, в которой данные из сети будет нужно отобразить на экране или пользовательский ввод потребуется записать в хранилище данных. Организация рандеву (особенно при рассмотрении этой проблемы в контексте оптимизаторов кода, процессоров с конвейерной архитектурой и многоуровневой кэш-памяти) может быть довольно сложной. Такая сложность становится до боли очевидной, когда программа какое-то время работала на одном процессоре, на первый взгляд, без проблем, но как только ее перенесли в многопроцессорную среду – она терпит крах в каких-то странных обстоятельствах, очень осложняющих отладку.

Процесс рандеву, делающий данные или состояние одного потока видимыми для другого потока, обычно называется публикацией ссылки. Когда один поток сохраняет состояние так, что это видно из другого потока, мы говорим, что он публикует ссылку на это состояние. Как было указано, единственный вариант надежной публикации ссылки требует, чтобы все потоки, ссылающиеся на данные, синхронизировались при использовании этих данных на одном объекте. Любые другие варианты неправильны и ненадежны.

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии