В компьютерном программировании одним из базовых понятий является возможность одновременного управления несколькими задачами. Множество проблем программирования требуют от программы способности приостанавливать текущую работу, чтобы заняться другими вопросами, а затем возвращаться к основному процессу. Это можно достичь различными путями. В самом начале, программисты с низкоуровневым знанием аппаратуры писали "обработчики прерываний", приостановка основного процесса осуществлялась через аппаратные прерывания. Хотя это был полезный подход, такие программы были сложны для переноса, что создавало другую группу дорогостоящих проблем.
Иногда прерывания необходимы для задач реального времени. Однако существует множество других задач, которые требуют разделения проблемы на автономные части программы, позволяющие всей системе быстрее реагировать на запросы пользователя. В одной программе эти автономные части называются "потоками" (Thread
), концепция использования которых известна как "многопоточность". Одним из наиболее распространённых примеров многопоточности является пользовательский интерфейс. Благодаря потокам пользователи могут нажимать кнопки, и программа немедленно реагирует, вместо того чтобы заставлять пользователя ждать завершения текущего действия.Начально, потоки использовались в качестве средства распределения времени выполнения одного процессора. Однако если операционная система поддерживает несколько процессоров, каждый поток может быть назначен на другой процессор, что позволяет действительно войти в состояние "параллельного вычисления". Из точки зрения языков программирования одним из самых ценных свойств многопоточности является то, что программист не обязан заботиться о том, сколько процессоров используется. Программа логически разделена на несколько потоков; если машина оснащена несколькими процессорами, программа будет работать быстрее, без необходимости специальной настройки.На основе вышеупомянутых рассуждений, возможно, вам кажется, что многопоточность очень проста. Однако следует обратить внимание на одну важную проблему: совместное использование ресурсов! Если несколько потоков выполняются одновременно и они пытаются получить доступ к одному и тому же ресурсу, возникают проблемы. Например, два процесса не могут отправлять информацию одновременно на один принтер. Для решения этой проблемы все общие ресурсы (например, принтер) должны находиться в состоянии блокировки во время их использования. Таким образом, один поток может заблокировать ресурс, завершив свою задачу, он затем освобождает (разблокирует) этот блок, позволяя другим потокам использовать тот же ресурс. Механизм многопоточности в Java уже встроен в язык, что делает возможной сложную задачу простой. Поддержка многопоточной обработки осуществляется на уровне объекта, поэтому один поток выполнения может быть представлен как объект. Java также предоставляет ограниченные схемы блокировки ресурсов. Она позволяет заблокировать любое место памяти, занимаемое объектом (память фактически является одним из множества общих ресурсов), так что одновременно может использовать конкретное пространство памяти только один поток. Для достижения этой цели используется ключевое слово synchronized
.Другие типы ресурсов должны быть явно заблокированы программистом, что обычно требует от программиста создания объекта, который представляет собой замок, и проверки этого замка всеми потоками при попытке получить доступ к этому ресурсу.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )