Концепция Java Thinking <Br /> В отличие от большинства других компьютерных языков, Java поддерживает многопоточное программирование в встроенных.
Многопоточная программа содержит две или более части, которые работают одновременно. Каждая такая часть в программе называется потоком, и каждый поток имеет независимый путь выполнения. Следовательно, многопоточное чтение является особой формой многозадачности.
Вы должны знать многозадачность, потому что она фактически поддерживается всеми современными операционными системами. Тем не менее, существует два различных типа многозадачности: на основе процессов и на основе потоков. Очень важно понимать различия между ними.
Для многих читателей многозадачность на основе процессов является более знакомым формой. Процесс, по сути, является программой выполнения. Поэтому многозадачность на основе процессов характеризуется путем позволяет вашему компьютеру запускать две или более программы одновременно. Например, многозадачность, основанная на процессах, позволяет вам одновременно запускать компилятор Java при использовании текстового редактора. В многозадачностью на основе процессов программа является наименьшей единицей кода, назначенной планировщиком.
В многозадачной среде на основе потоков потоки являются наименьшим блок исполнения. Это означает, что программа может выполнять функции двух или более задач одновременно. Например, текстовый редактор может отформатировать текст во время печати. Таким образом, многопроцессорные программы обрабатывают «большие картинки», в то время как многопоточные программы обрабатывают детали.
Многопользовательские программы требуют меньше административных расходов, чем многопроцессорные программы. Процессы - это тяжелые задачи, которые требуют их собственного независимого адресного пространства. Межпроцессное общение дорого и ограничено. Преобразование между процессами также очень дорого. Ниды, с другой стороны, являются легкими игроками. Они разделяют одно и то же адресное пространство и совместно используют один и тот же процесс. Межпоточная связь дешевая, а межпоточное преобразование также недорогая. Когда программа Java использует многопроцессную среду обработки задач, многопроцессная программа не контролируется Java, в то время как многопоточное управление Java контролируется.
Многопользовательский состав поможет вам писать эффективные программы с максимальным использованием ЦП, так как время простоя сохраняется как минимум. Это имеет решающее значение для среда интерактивных сетевых взаимодействий, работающих на Java, потому что свободное время является общедоступным. Например, скорость передачи данных в сети намного ниже, чем в обработке компьютера, а скорость чтения и записи ресурсов локальной файловой системы намного ниже, чем в процессоре. Полем В традиционной однопользованной среде ваша программа должна ждать, пока каждая такая задача выполнит, прежде чем выполнить следующий шаг-хотя процессор имеет много свободного времени. Многопользовательский режим позволяет получить и максимально использовать это свободное время.
Модель потока Java
Система времени выполнения Java во многих отношениях опирается на потоки, и все конструкции библиотеки классов учитывают многопоточное. На самом деле, Java использует темы, чтобы сделать всю среду асинхронной. Это помогает уменьшить неверную часть, предотвращая отходы петлей процессора.
Чтобы лучше понять преимущества многопоточной среды, ее можно сравнить с ее контролем. Метод обработки однопоточной системы заключается в использовании метода цикла событий, называемого опросом. В этой модели однопоточный контроль проходит в бесконечной петле, опрашивая последовательность событий, чтобы определить, что делать дальше. Как только избирательное устройство возвращает сигнал о том, что сетевой файл готов к чтению, элемент управления планированием цикла событий управляет соответствующим обработчиком событий. Пока обработчик событий не вернется, в системе не происходит никаких других событий. Это тратит время процессора. Это заставляет часть программы занимать исключительно систему и предотвратить выполнение других событий. В целом, в среде с одним нагрузкой, когда поток блокирует (блокирует, приостанавливает выполнение) во время ожидания ресурсов, вся программа прекращается.
Преимущество многопоточного чтения Java заключается в том, что он отменяет основной механизм цикла/опроса. Поток можно приостановить, не влияя на другие части программы. Например, время холостого хода, сгенерированное, когда поток считывает данные из сети или ожидает использования пользовательского ввода в другом месте. Многопользовательский режим позволяет живой петле спать в течение одной секунды в каждом кадре, не приостанавливая всю систему. В программе Java есть блокировка потока, приостановлен только один поток, а другие потоки продолжают работать.
Потоки существуют в нескольких штатах. Поток может работать. Он может работать до тех пор, пока вы получаете время процессора. Заводящий поток может быть приостановлен и временно прервать его выполнение. Подвесная поток может быть возобновлен, что позволяет ему продолжить работу от того места, где он остановился.
В любое время поток может прекратиться, что сразу же прерывает свою работу. После завершения поток не может быть восстановлен.
Приоритет потока
Java расставляет приоритеты в каждом потоке, чтобы определить, как обрабатывать поток по сравнению с другими потоками. Приоритет потока является целым числом, в котором подробно описывается приоритетная связь между потоками. В качестве абсолютного значения приоритет бессмысленен; Вместо этого используется приоритет потока, чтобы определить, когда переключаться с одного запущенного потока на другой. Это называется «контекст -переключатель». Правила, которые определяют возникновение контекста, просты:
Поток может автоматически отказаться от контроля. В случае ввода/вывода не определились, сон или блокировка выполняется явными уступками. В этом предположении все остальные потоки обнаруживаются, и поток с наивысшим приоритетом, готовый к запуску, предоставляется процессору.
Ниды можно преодолеть высокоприоритетными потоками. В этом случае нить с низким приоритетом не сдается активно, процессор только что занят сначала - независимо от того, что он делает - процессор занимает высокоприоритетную нить. По сути, после того, как поток высокого приоритета будет запущен, он выполняется. Это называется приоритетной многозадачностью.
Ситуация немного сложна, когда две нити одного и того же приоритета конкурируют за циклы процессора. Для операционных систем, таких как Windows 98, потоки с одинаковым приоритетом автоматически делят время в режиме цикла. Для других операционных систем, таких как Solaris 2.x, приоритетные потоки автоматически оставляются по сравнению с их сверстниками. Если это не так, другие потоки не будут работать.
ПРЕДУПРЕЖДЕНИЕ: Преобразование контекста нижних приоритетных потоков в различных операционных системах может генерировать ошибки.
Синхронизация
Поскольку в вашей программе многопоточности представляют асинхронное поведение, должны быть способы улучшить синхронизацию, когда вам это нужно. Например, если вы хотите, чтобы два потока общались друг с другом и разделяли сложную структуру данных, такую как последовательность связанных списков, вам нужен какой -то способ убедиться, что они не противоречат друг другу. То есть вы должны предотвратить написание данных в одном потоке, в то время как другой поток читает данные из связанного списка. С этой целью Java реализует другой метод, основанный на старой модели межпроцессной синхронизации: монитор. Процесс управления представляет собой механизм управления, впервые определяемый Carhoare.
Вы можете думать о процессе управления как о небольшой коробке, которая управляет только одним потоком. Как только резьба попадает в трубу, все резьбы должны ждать, пока нить не выйдет из трубы. Таким образом, руководство может быть использовано для предотвращения манипулирования общими ресурсами несколькими потоками.
Многие многопоточные системы рассматривают процесс управления как объект, на который программа должна четко ссылаться и работать. Java обеспечивает четкое решение. Вместо этого нет класса «монитора»; Как только поток включен в метод синхронизации, ни один другой поток не может вызвать метод синхронизации того же объекта. Это позволяет вам писать очень четкий и краткий многопоточный код, так как поддержка синхронизации встроена на язык.
Доставка сообщения
После того, как вы разделяете программу на несколько потоков, вам необходимо определить соединение между каждым потоком. При планировании на большинстве других языков вы должны полагаться на операционную систему, чтобы установить межпоточную связь. Это, безусловно, увеличит стоимость. Тем не менее, Java обеспечивает чистый, недорогой способ общения между множественными чтениями - вызывая предопределенные методы, которые имеют все объекты. Система обмена сообщениями Java позволяет потоке вводить синхронный метод объекта, а затем ждать там, пока другие потоки явно уведомит его.
Класс потоков и запускаемый интерфейс
Многопоточная система Java основана на классе потоков, его методах и ее интерфейсной интерфейсе. Класс потока инкапсулирует выполнение потоков. Поскольку вы не можете напрямую ссылаться на состояние запущенного потока, вы должны обработать его через его прокси, поэтому экземпляр потока генерируется. Чтобы создать новый поток, ваша программа должна расширить поток или реализовать запускаемый интерфейс.
Класс потоков определяет несколько методов, помогающих управлять потоками. Методы, используемые в этой главе, показаны в таблице: