Вопросы по дисциплине «Языки программирования»

Экзаменационные билеты по предмету «Программирование»
Информация о работе
  • Тема: Вопросы по дисциплине «Языки программирования»
  • Количество скачиваний: 9
  • Тип: Экзаменационные билеты
  • Предмет: Программирование
  • Количество страниц: 5
  • Язык работы: Русский язык
  • Дата загрузки: 2014-11-27 00:28:26
  • Размер файла: 15.68 кб
Помогла работа? Поделись ссылкой
Информация о документе

Документ предоставляется как есть, мы не несем ответственности, за правильность представленной в нём информации. Используя информацию для подготовки своей работы необходимо помнить, что текст работы может быть устаревшим, работа может не пройти проверку на заимствования.

Если Вы являетесь автором текста представленного на данной странице и не хотите чтобы он был размешён на нашем сайте напишите об этом перейдя по ссылке: «Правообладателям»

Можно ли скачать документ с работой

Да, скачать документ можно бесплатно, без регистрации перейдя по ссылке:

Вопросы по дисциплине «Языки программирования»

1. Класс Thread
2. Исполнители (Executors)
Исполнители (executor) управляют выполнением потоков. Первым в иерархии исполнителей является интерфейс Executor, который служит для запуска потока. Интерфейс ExecutorService расширяет интерфейс Executor и предлагает методы, управляющие исполнением. Существует несколько реализаций интерфейса ExecutorService: классы ThreadPoolExecutor, Scheduled-ThreadPoolExecutor. Пакет java. util. concurrent также определяет служебный класс Executors, который содержит несколько статических методов, упрощающих создание разнообразных исполнителей.
CachedThreadPool
Создает пул потоков, который создает новые потоки по мере необходимости, но будет повторно использовать ранее построенные потоки, когда они доступны. Эти пулы, как правило, повышают производительность программ, которые выполняют множество короткоживущих асинхронных задач.
Запрос на выполнение будет повторен для ранее добавленных потоков, если они доступны. Если ни один из существующих потоков не доступен, новый поток будет создан и добавлен в пул. Потоки, которые не были использованы в течение шестидесяти секунд прекращаются и удаляется из кэша. Таким образом, пул, который не используется в течение достаточно долго не будет потреблять ресурсы.
Вызов shutdown() предотвращает передачу Executor новых задач. Текущий поток продолжает выпол¬няться со всеми задачами, переданными до вызова shutdown().
FixedThreadPool
Пул фиксированный, одно временно могут выполняться только фикс число потоков. Если дополнительные задачи представляются, когда все темы являются активными, они будут ждать в очереди, пока поток не доступен. Если поток завершается из-за сбоя во время выполнения до выключения, новый займет свое место, если это необходимо для выполнения последующих задач. Потоки в бассейне будет существовать, пока не будет явно выключения.
SingleThreadPool
Создает Исполнителя, который использует один рабочий поток с неограниченной очередью. Новые задачи из очереди выполняются в том же потоке. (Примечание, однако, что, если это один поток завершает из-за сбоя во время выполнения до выключения, новый займет свое место, если это необходимо для выполнения последующих задач.) Задачи гарантированно выполняться последовательно, и не более чем одна задача будет активна в любой момент времени.
Sheduled тоже 3 типа.
Создает исполнителя, который может планировать команды для запуска после определенного задержки или периодически их выполнять.
3. Возврат значений из задач, ожидание, приоритет
Интерфейс Callable представляет поток, возвращающий значение. Приложение может использовать объекты интерфейса Callable для вычисле¬ния результатов, которые затем будут возвращены вызывающему потоку. Его также можно использовать и для запуска потока, возвращающего код со¬стояния, который свидетельствует об успешном выполнении потока.
interface Callable<T> - T тип возвращаемого значения.
Интерфейс Callable определяет только один метод call ().
V call() throws Exception
Внутри метода call() определяется задача, которую требуется выполнить. После того как она будет выполнена, возвращается результат. Если результат не¬возможно вычислить, метод call () передает исключение.
Задача интерфейса Callable решается при вызове метода submit (), опре¬деленного в интерфейсе ExecutorService.
<T> Future<T> submit (Сallаblе<Т> задача)
Здесь параметр задача представляет объект интерфейса Callable, который будет выполняться в собственном потоке. Результат возвращается через объект интерфейса Future.
Интерфейс Future является обобщенным интерфейсом, представляющим значение, которое будет возвращено при помощи объекта интерфейса Callable. Поскольку это значение будет получено в некотором будущем, то имя интерфейса (Future) говорит само за себя. Интерфейс Future определяется следующим об¬разом.
interface Future<V>
Здесь параметр V определяет тип результата.
Чтобы получить значение, нужно вызвать метод get () интерфейса Future, который имеет следующие две формы.
V get()
V get(long ожидать, TimeUnit tu)
В первом случае ожидание получения результатов длится бесконечно долго. Во втором случае можно указать период времени в параметре ожидать. Единицы пе¬риода времени в этом параметре задаются параметром tu, который представляет собой объект перечисления TimeUnit.
Вы можете обратиться к Future с запросом isDone(), что¬бы узнать, завершена ли операция. После завершения задачи и появления ре¬зультата производится его выборка методом get(). Если get() вызывается без предварительной проверки isDone(), вызов блокируется до появления результата.
Перегруженный метод Executors.callable() получает Runnable и выдает Callable. ExecutorService содержит методы для выполнения коллекций объектов Callable.
Метод sleep () из TimeUnit приостанавливает выполнение на определенный период вре-мени, который задается в виде вызывающей константы перечисления. Он преоб¬разуется в вызов метода Thread. sleep ().
Приоритет (priority) потока сообщает планировщику информацию об относи¬тельной важности потока. Хотя порядок обращения процессора к существую¬щему набору потоков и не детерминирован, если существует несколько приос¬тановленных потоков, одновременно ожидающих запуска, планировщик сна¬чала запустит поток с большим приоритетом. Впрочем, это не значит, что пото¬ки с младшими приоритетами не выполняются вовсе (то есть тупиковых ситуа¬ций из-за приоритетов не возникает). Потоки с более низкими приоритетами просто запускаются чуть реже. getPriority и setPriority.
4. Передача управления, потоки-демоны
Если вы знаете, что в текущей итерации run() сделано все необходимое, вы можете подсказать механизму планирования потоков, что процессором теперь может воспользоваться другой поток. Эта подсказка (не более чем рекомендация; нет никакой гарантии, что планировщик потоков «прислушается» к ней) воплощается в форме вызова метода yield(). Вызывая yield(), вы сообщаете системе, что в ней могут выполняться другие потоки того же приоритета.
Демоном называется поток, предоставляющий некоторый сервис, работая в фо¬новом режиме во время выполнения программы, но при этом не является ее не¬отъемлемой частью. Таким образом, когда все потоки не-демоны заканчивают свою деятельность, программа завершается. И наоборот, если существуют рабо¬тающие потоки не-демоны, программа продолжает выполнение. Чтобы назначить поток демоном, следует перед его запуском вызвать метод setDaemon().Чтобы узнать, является ли поток демоном, вызовите метод isDaemon(). Если поток является демоном, то все потоки, которые он производит, также будут де¬монами. Учтите, что потоки-демоны завершают свои методы run() без секций finally:
5. Подсоединение к потоку
Любой поток может вызвать метод join(), чтобы дождаться завершения другого потока перед своим продолжением. Если поток вызывает t.join() для другого потока t, то вызывающий поток приостанавливается до тех пор, пока целевой поток t не завершит свою работу (когда метод t.isAlive() вернет значение false).
Вызвать метод join() можно также и с аргументом, указывающим продолжительность ожидания (в миллисекундах или в миллисекундах с наносекундами). Если целевой поток не закончит работу за означенный период времени, метод join() все равно вернет управление инициатору.
Вызов join() может быть прерван вызовом метода interrupt() для потока-инициатора, поэтому потребуется блок try-catch.
6. Совместное использование ресурсов. Некорректный доступ к ресурсам
Прежде, чем получить доступ к общему ресурсу сурсу, запрашивается блокировка, защищающая этот ресурс. Когда доступ к ресурсу будет завершен, блокировка снимается. Если второй поток попытается запросить блокировку в тот момент, когда она используется еще каким-нибудь потоком, первый поток будет ожидать, пока блокировка не будет снята. Благодаря этому появляется возможность избежать возникновения конфликта доступа к общему ресурсу.
Блокировки особенно полезны тогда, когда нескольким потокам нужно получить доступ к значению из общих данных. Например, приложение складского учета может иметь поток, который сначала подтверждает, что товар имеется на складе, а затем уменьшает количество доступных товаров после каждой продажи. Если будет выполняться два или более таких потока, то без синхронизации может получиться так, что один поток начнет свою транзакцию в момент выполнения транзакции другим потоком. В результате этого оба потока будут предполагать о существовании достаточного количества товара, хотя на самом деле товара будет ровно столько, сколько требуется для осуществления одной продажи. В подобных ситуациях с помощью блокировок можно организовывать синхронную работу потоков.
7. Разрешение конфликтов доступа
Synchronized. Когда поток желает выполнить фрагмент кода, охраняемый словом synchronized, он проверяет, доступен ли семафор, получает доступ к семафору, выполняет код и освобождает семафор.
8. Объекты Lock
void lock() Ожидание длится до тех пор, пока вызываемая блокировка не может быть получена
void locklnterruptibly() Ожидание длится до тех пор, пока вызываемая блокировка не может быть получена, если только не произойдет прерывание
Condition newCondition() Возвращает объект Condition, связанный с вызываемой блокировкой
boolean tryLockO Пытается запросить блокировку. Этот метод не входит в режим ожидания, если блокировка не является свободной. Вместо этого он возвращает значение true, если блокировка была получена, и значение false, если на данный момент блокировка используется другим потоком
boolean tryLock(long ожидать, TimeUnit tu) Пытается получить блокировку. Если блокировка недоступна, то метод будет ожидать столько времени, сколько указано в параметре ожидать, единицы которого определены параметром tu. Он возвращает значение true, если блокировка была получена, и значение false, если блокировка не была получена в течение заданного периода
void unlock() Снимает блокировку
Класс ReentrantLock делает возможной попытку получения блокировки с последующим отказом от нее. Таким образом, если кто-то уже захватил блокировку, вы можете отказаться от своих намерений (вместо того, чтобы дожидаться ее освобождения).
9. Атомарные операции, ключевое слово volatile
Атомарная операция — это операция, которую не может прервать планировщик потоков — если она начинается, то продолжается до завершения, без возможности переключения контекста (переключения выполнения на другой поток).
Чтение и запись примитивных переменных гарантированно выполняются как атомарные (неделимые) операции. С другой стороны, JVM разрешается выполнять чтение и запись 64-разрядных величин (long и double) в виде двух раздельных 32-разрядных операций, с ненулевой вероятностью переключения контекста в ходе чтения или записи. Для достижения атомарности (при простом присваивании и возврате значений) можно определить типы long и double с модификатором volatile. Ключевое слово volatile обеспечивает видимость в рамках приложения. Если поле объявлено как volatile, это означает, что сразу же после записи в поле изменение будет отражено во всех последующих операциях чтения. Утверждение истинно даже при участии локальных кэшей — поля volatile немедленно записываются в основную память, и дальнейшее чтение происходит из основной памяти.
10. Атомарные классы


11. Критические секции
Иногда необходимо предотвратить доступ нескольких потоков только к части кода, а не к методу в целом. Фрагмент кода, который изолируется таким способом, называется критической секцией (critical section), для его создания также применяется ключевое слово synchronized. На этот раз слово synchronized определяет объект, блокировка которого должна использоваться для синхронизации последующего фрагмента кода. Такая конструкция иначе называется синхронизированной блокировкой (synchronized block); перед входом в нее необходимо получить блокировку для syncObject. Если блокировка уже предоставлена другому потоку, вход в последующий фрагмент кода запрещается до тех пор, пока блокировка не будет снята.
12. Синхронизация по объектам


13. Локальная память потока
14. Взаимодействие между потоками (wait, notifyAll)
15. Взаимодействие между потоками (каналы ввода/вывода)
16. Взаимная блокировка
17. Библиотечный компонент CountDownLatch
18. Библиотечный компонент CyclicBarrier
19. Библиотечный компонент DelayQueue
20. Библиотечный компонент PriorityBlockingQueue
21. Семафоры
22. Поставщик/потребитель. Exchanger.
23. Управление оранжереей. ScheduledExecutor.
24. Модель кассира.
25. Задача об обедающих философах
26. Задача о читателях и писателях







Литература

Брюс Эккель. Философия Java. 4 издание
Страницы 557 – 630

Грегори Эндрюс. Основы многопоточного, параллельного и распределенного программирования
Страницы 139 - 149