Реализация многозадачности в Java

Многозадачность (multitasking) означает способность компьютера одновременно выполнять сразу несколько программ, например, слушать музыку во время игры в любимую игрушку.

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

К примеру, даже если очень быстро набирать символы на клавиатуре и на ввод одного символа тратить всего 1/20 секунды, то даже это будет огромный интервал для процессора. Ведь современные процессоры могут обрабатывать миллионы запросов в секунду. Многозадачность может быть реализована двумя способами: или операционная система прерывает выполнение задачи, или управление операционной системе возвращается по усмотрению самой программы, например, после выполнения определенной задачи.

Первый способ называется вытесняющей многозадачностью (preemptive multitasking), а второй - кооперативной (или невытесняющей) многозадачностью (cooperative multitasking). Кооперативная многозадачность применяется в ранних версия Windows и Mac OS 9, а вытесняющая - в UNIX, Linux, Windows NT/2000/XP и Mac OS X.

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

Каждая задача обычно сокращенно называется потоком (thread) или полностью - потоком управления (thread of control). Программы, способные запускать более одного потока, называются многопоточными (multithreaded). Каждый поток выполняется в отдельном контексте, т.е. создается видимость того, что каждый поток имеет собственный процессор с регистрами, памятью и своим кодом.

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

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

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

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