Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Многопоточность. 5.1. Общие сведения о потоках. Рис 5.1. Диаграмма распределения времени и работы между 3-мя потоками для одного процессора.




Многопоточность

 

Цель работы: Изучить приемы и методы организации и управления потоками.

 

5. 1. Общие сведения о потоках

А что такое вообще поток как явление? Это набор исполняемых инструкций. Практически все современные ОС позволяют исполнять несколько таких наборов одновременно. Ну, одновременно - понятие, конечно, относительное. Правильно было бы сказать - одновременно с точки зрения пользователя. Ибо процессор один и исполнять он может только один набор инструкций. Потому, для создания видимости одновременной работы процессор исполняет определенное количество инструкций одного потока, после чего переключается на другой. Это происходит очень часто, в результате чего создается иллюзия одновременной работы (рис 7. 1).

 

Рис 5. 1. Диаграмма распределения времени и работы между 3-мя потоками для одного процессора.

Для чего это нужно. Современное ПО по большей часто асинхронно. Приложение ждет реакции пользователя, приложение ждет прихода данных по сети, приложение ждет готовности устройства. Приложение ждет. Если вы посмотрите на загрузку процессора, то увидите, что чаще всего 99% времени он простаивает. Соответственно, пока одна задача находится в стадии ожидания, можно заниматься другой. Например, во время ожидания прихода данных по сети можно отрисовать то, что уже пришло. Это если говорить о браузере. Да и вообще, в ОС одновременно происходит множество разных событий. Если бы всеми ими занимался один единственный поток - все работало бы значительно медленнее. Если бы вообще работало.

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

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

Базовые классы для работы с потоками

Многозадачность позволяют реализовывать следующие классы и интерфейсы:

· класс java. util. Timer

· класс javax. swing. Timer

· класс Thread

· интерфейс Runnable

Класс Thread

Поток выполнения в Java представляется экземпляром класса Thread. Для того, чтобы написать свой поток исполнения необходимо наследоваться от этого класса и переопределить метод run(). Например,

public class MyThread extends Thread { public void run() {

// некоторое долгое действие, вычисление

long sum=0;

for (int i=0; i< 1000; i++) {

sum+=i;

}

System. out. printin(sum);

}

 }

Метод run() содержит действия, которые должны исполняться в новом потоке исполнения. Чтобы запустить его, необходимо создать экземпляр класса-наследника, и вызвать наследованный метод startQ, который сообщает виртуальной машине, что необходимо запустить [овый поток исполнения и начать в нем исполнять метод гип().

MyThread t = new MyThread();

t. start();

В результате чего на консоли появится результат: 499500

Когда метод rип() завершен (в частности, встретилось выражение return) поток выполнения останавливается. Однако, ничто не препятствует записи бесконечного цикла в этом методе.

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

Класс Thread содержит несколько методов для управления потоками.

  • getName() - получить имя потока
  • getPriority() - получить приоритет потока
  • isAlive() - определить, выполняется ли поток
  • join() - ожидать завершение потока
  • run() - запуск потока
  • sleep() - приостановить поток на заданное время
  • start() - запустить поток вызовом метода start()

Интерфейс Runnable

Описанный подход обладает одним недостатком. Поскольку в Java отсутствует множественное наследование, требование наследоваться от Thread может привести конфликту. Если еще раз посмотреть на приведенный выше пример, то станет понято, что наследование производилось только с целью переопределения метода runQ. Поэтому предлагается более простой способ. создать свой поток исполнения. Достаточно реализовать интерфейс Runnable, в котором объявлен только один метод - уже „знакомый void runQ. Запишем пример, приведенный выше, с помощью этого интерфейса:

public class MyRunnable implements Runnable {

public void run() {

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...