Асинхронные задачи
Что такое FutureTask?
FutureTask — это класс из java.util.concurrent
, который представляет собой отменяемую асинхронную задачу, поддерживающую
методы получения результата и отмены задачи.
Основные возможности:
-
Запуск задачи:
- Можете запускать с помощью потока или исполнительного сервиса (
ExecutorService).
- Можете запускать с помощью потока или исполнительного сервиса (
-
Получение результата:
- Метод
get()возвращает результат выполнения задачи, ожидая её завершения при необходимости.
- Метод
-
Отмена задачи:
- Метод
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,
который управляет доступом к ресурсу через счетчик разрешений, ограничивая
количество потоков, которые могут одновременно использовать ресурс.
Основные возможности:
-
Получение разрешения:
- Метод
acquire()уменьшает счетчик разрешений, если разрешения доступны, иначе поток блокируется до освобождения разрешения.
- Метод
-
Освобождение разрешения:
- Метод
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 ограничивает доступ к ресурсу, позволяя одновременно работать с ним не более трём потокам.