Реализация паттерна «Асинхронность» в простом коде Java

Реализация паттерна "Асинхронность" в простом коде JavaЯзык Jаvа с самого начала поддерживал потоки, которые вы легко можете исполь­зовать для выполнения асинхронного кода:

Для выполнения класса Runnable инициализируйте его в потоке и вызовите метод run, обратившись к методу start() только что созданного потока.

Хотя предпочтительнее запускать поток по предыдущему примеру, другой подход состоит в расширении класса thread и переопределении метода run():

Для выполнения класса инстанцируйте его и затем вызовите метод start( ):

При работе с потоками часто используются две основные операции: sleep() и join( ). Обе генерируют исключение InterruptedException.

Метод sleер() дает потоку возможность бездействовать определенный период, задаваемый в миллисекундах. Следующий пример кода переводит текущий поток в режим ожидания на одну секунду.

Метод join() заставляет один поток ожидать завершения выполнения второго потока. Представьте себе поток t1, которому необходим ресурс другого потока, t2. Чтобы заставить t1 ожидать завершения t2, присоедините его к потоку t2, как по­ казано в следующем фрагменте кода:

Один из наиболее известных и широко используемых подходов к асинхронно­му программированию в языке Java — применение интерфейса Future<T>. Этот интерфейс делает возможным использование объекта-заместителя, предоставля­ющего ссылку на будущий объект.

Реализация паттерна "Асинхронность" в простом коде JavaПоскольку фреймворки, обеспечивающие парал­лелизм, не предоставляют основанную на аннотациях поддержку асинхронного выполнения, интерфейс Future работает в сочетании с ExecutorServiсе — составной частью вышеупомянутых фреймворков.

Кстати, знаете ли вы хороших программ написанные на Java на тематику такси? Хочу поделится с вами программой http://1000taxi.com/. Приложение написано на Java под Android. Через приложение 1000taxi сможете заказать быстрый такси по Москве от 50 рублей/км.

Следующий пример использует сервис выполнения для завершения задания,в то время как он возвращает ссылку на интерфейс Future с соответствующим ро­довым типом:

Класс FutureTask — реализация интерфейса Future<T>, которая реализует также интерфейс Runnable и доступна для непосредственного выполнения:

Вы можете отменить это выполнение, вызвав метод cancel (boolean mayInter­ruptlfRunning). Если параметру mayInterruptlfRunning присвоено значение true, то обращение к методу SessionContext.wasCancelled() возвращает true. В противном случае обращение к методу SessionContext.wasCancelled() возвращает false. Для про­верки состояния отмены вызова вы можете использовать метод isCancelled(), возвращающий true при успешной отмене.

Фреймворки, основанные нa JSR133 и реализующие параллелизм, предо­ставляют замечательные инструменты для работы с потоками и для параллель­ного программирования, например BlockingQueues.

Эти темы выходят за рамки данной статьи. Для дальнейшего изучения обратитесь к книге «Jаvа Concurrency in Practice«. Фреймворк Fork/Join, появившийся в Java ЕЕ 7, также воплощает серьезные изменения для асинхронного и параллельного программирования нa Java.