Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Асинхронные задачи

Все темы Java Developer

Что такое FutureTask?

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

Основные возможности:

  1. Запуск задачи:
    • Можете запускать с помощью потока или исполнительного сервиса (ExecutorService).
  2. Получение результата:
    • Метод get() возвращает результат выполнения задачи, ожидая её завершения при необходимости.
  3. Отмена задачи:
    • Метод cancel(boolean mayInterruptIfRunning) позволяет отменить задачу.

Пример:

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();
    }
}

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


Что такое Semaphore?

Semaphore — это класс из java.util.concurrent, который управляет доступом к ресурсу через счетчик разрешений, ограничивая количество потоков, которые могут одновременно использовать ресурс.

Основные возможности:

  1. Получение разрешения:
    • Метод acquire() уменьшает счетчик разрешений, если разрешения доступны, иначе поток блокируется до освобождения разрешения.
  2. Освобождение разрешения:
    • Метод release() увеличивает счетчик разрешений, освобождая ресурс.

Пример:

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();
        }
    }
}

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

Эта страница была полезной?