Краткое изложение основных операций FutureTask

Java задняя часть
Краткое изложение основных операций FutureTask

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

Нажмите, чтобы узнать подробностиwww.codercc.com

1. Введение в FutureTask

В среде Executors FutureTask используется для представления асинхронных задач, которые могут получать результаты. FutureTask реализует интерфейс Future, а FutureTask предоставляет некоторые общие методы для запуска и отмены асинхронных задач, запроса завершения вычислений асинхронными задачами и получения окончательных результатов асинхронных задач. пройти черезget()метод для получения результата асинхронной задачи, но заблокирует текущий поток до завершения выполнения асинхронной задачи. После завершения выполнения задачи ее нельзя перезапустить или отменить, если только неrunAndReset()метод. Эти состояния определены для FutureTask в его исходном коде:

private static final int NEW          = 0;
private static final int COMPLETING   = 1;
private static final int NORMAL       = 2;
private static final int EXCEPTIONAL  = 3;
private static final int CANCELLED    = 4;
private static final int INTERRUPTING = 5;
private static final int INTERRUPTED  = 6;

Кроме того, в книге «Искусство параллельного программирования на Java» автор делит FutureTask на 3 состояния в зависимости от времени выполнения метода FutureTask.run():

  1. не инициировано. FutureTask не запускается до тех пор, пока не будет выполнен метод FutureTask.run(). Когда FutureTask создается, FutureTask находится в незапущенном состоянии до выполнения метода FutureTask.run().
  2. активирован. Во время выполнения метода FutureTask.run() FutureTask находится в запущенном состоянии.
  3. завершенный. Завершается выполнение метода FutureTask.run(), либо вызывается метод FutureTask.cancel(...) для отмены задачи, либо возникает исключение во время выполнения задачи. Такие ситуации называются завершенным состоянием БудущееЗадание.

На следующем рисунке показан процесс изменения состояния FutureTask:

FutureTask状态迁移图.jpg
Диаграмма перехода состояний FutureTask.jpg

Поскольку FutureTask имеет эти три состояния, выполнение метода get и метода отмены FutureTask, результаты, соответствующие разным состояниям, также сильно различаются. Вот краткое описание методов get и cancel:

получить метод

Выполнение метода FutureTask.get(), когда FutureTask находится в незапущенном или запущенном состоянии, приведет к блокировке вызывающего потока. Если FutureTask находится в завершенном состоянии, вызов метода FutureTask.get() приведет к тому, что вызывающий поток немедленно вернет результат или выдаст исключение.

метод отмены

Когда FutureTask находится внеактивное состояниеПри выполнении метода FutureTask.cancel() задача никогда не будет выполнена;

Когда FutureTask находится вактивированное состояниеПри выполнении метода FutureTask.cancel(true) он прерывает поток, чтобы предотвратить продолжение задачи.Если вы выполняете FutureTask.cancel(false), это не повлияет на поток, выполняющий задачу;

когдаFutureTaskВ завершенном состоянии выполнение метода FutureTask.cancel(...) вернет false.

Обобщите метод get() и метод отмены() Future с помощью следующего рисунка.

FutureTask的get和cancel的执行示意图.jpg
Схематическая диаграмма выполнения получения и отмены FutureTask.jpg

2. Базовое использование FutureTask

Помимо реализации интерфейса Future, FutureTask также реализует интерфейс Runnable. Таким образом, FutureTask может быть передан исполнителю для выполнения или может быть выполнен непосредственно вызывающим потоком (FutureTask.run()). Кроме того, получение FutureTask также может вернуть объект FutureTask с помощью метода ExecutorService.submit(), а затем с помощью метода FutureTask.get() или FutureTask.cancel.

**Сценарий приложения:** Когда потоку необходимо дождаться завершения задачи другим потоком, прежде чем он сможет продолжить выполнение, вы можете использовать FutureTask в это время. Предположим, что есть несколько потоков, выполняющих несколько задач, и каждая задача может быть выполнена не более одного раза. Когда несколько потоков пытаются выполнить одну и ту же задачу, только одному потоку разрешено выполнять задачу, а другим потокам необходимо дождаться выполнения задачи, прежде чем продолжить выполнение.

использованная литература

Искусство параллельного программирования на Java