---
title: Асинхронные задачи
seo:
  title: Асинхронные задачи — Java Developer
  description: Тема «Асинхронные задачи» для собеседования Java Developer. Что такое FutureTask? Что такое Semaphore?
---

[Все темы Java Developer](/java-developer)

## <strong>Что такое</strong> <code>FutureTask</code><strong>?</strong> [#q-14bee738d69b8126aaedc72b8345fe3e]

<code>FutureTask</code> — это класс из <code>java&#46;util&#46;concurrent</code>
, который представляет собой отменяемую асинхронную задачу, поддерживающую
методы получения результата и отмены задачи.

#### Основные возможности&#58;

{/* prettier-ignore */}
1. <strong>Запуск задачи&#58;</strong>

    - Можете запускать с помощью потока или исполнительного сервиса (<code>ExecutorService</code>).

1. <strong>Получение результата&#58;</strong>

    - Метод <code>get&#40;&#41;</code> возвращает результат выполнения задачи, ожидая её завершения при необходимости.

1. <strong>Отмена задачи&#58;</strong>

    - Метод <code>cancel&#40;boolean mayInterruptIfRunning&#41;</code> позволяет отменить задачу.

#### Пример&#58;

```java
import java.util.concurrent.*;

public class FutureTaskExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<Integer> callable = () -> {
            // Долгая задача
            return 123;
        };

        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        ExecutorService executor = Executors.newFixedThreadPool(1);
        executor.execute(futureTask);

        // Ожидание результата
        Integer result = futureTask.get();
        System.out.println("Result: " + result);

        executor.shutdown();
    }
}
```

В этом примере <code>FutureTask</code> выполняет асинхронную задачу, результат которой можно получить с помощью метода <code>get&#40;&#41;</code>.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::

---

## <strong>Что такое</strong> <code>Semaphore</code><strong>?</strong> [#q-14bee738d69b81158f98fab9b8194535]

<code>Semaphore</code> — это класс из <code>java&#46;util&#46;concurrent</code>,
который управляет доступом к ресурсу через счетчик разрешений, ограничивая
количество потоков, которые могут одновременно использовать ресурс.

#### Основные возможности&#58;

{/* prettier-ignore */}
1. <strong>Получение разрешения&#58;</strong>

    - Метод <code>acquire&#40;&#41;</code> уменьшает счетчик разрешений, если разрешения доступны, иначе поток блокируется до освобождения разрешения.

1. <strong>Освобождение разрешения&#58;</strong>

    - Метод <code>release&#40;&#41;</code> увеличивает счетчик разрешений, освобождая ресурс.

#### Пример&#58;

```java
import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    private final Semaphore semaphore = new Semaphore(3); // Разрешает до 3 потоков

    public void accessResource() {
        boolean acquired = false;
        try {
            semaphore.acquire();
            acquired = true;
            // Критическая секция
            System.out.println(Thread.currentThread().getName() + " is accessing resource");
            Thread.sleep(2000); // Симуляция работы с ресурсом
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            if (acquired) {
                semaphore.release();
                System.out.println(Thread.currentThread().getName() + " has released resource");
            }
        }
    }

    public static void main(String[] args) {
        SemaphoreExample example = new SemaphoreExample();

        for (int i = 0; i < 5; i++) {
            new Thread(example::accessResource).start();
        }
    }
}
```

В этом примере <code>Semaphore</code> ограничивает доступ к ресурсу, позволяя одновременно работать с ним не более трём потокам.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::
