java.util.concurrent, предназначенный для управления доступом к общим ресурсам в многопоточных приложениях. Он позволяет ограничить количество потоков, которые могут одновременно использовать определенный ресурс.Семафор управляет набором разрешений, и поток может запросить или освободить разрешение, тем самым контролируя доступ к общим ресурсам.
Конструктор:
Semaphore(int permits) - создает семафор с указанным числом разрешений.Методы для получения разрешений:
void acquire() - запрашивает одно разрешение. Если разрешение недоступно, поток блокируется до тех пор, пока разрешение не станет доступным.void acquire(int permits) - запрашивает указанное количество разрешений.boolean tryAcquire() - запрашивает одно разрешение, если оно доступно, не блокируя поток. Возвращает true, если разрешение получено, и false в противном случае.boolean tryAcquire(long timeout, TimeUnit unit) - запрашивает одно разрешение, если оно доступно в течение указанного времени. Возвращает true, если разрешение получено, и false в противном случае.Методы для освобождения разрешений:
void release() - освобождает одно разрешение, увеличивая внутренний счетчик разрешений.void release(int permits) - освобождает указанное количество разрешений.Пример:
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private static final int MAX_CONCURRENT_THREADS = 3;
private static final Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS);
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new Worker(i)).start();
}
}
static class Worker implements Runnable {
private final int id;
Worker(int id) {
this.id = id;
}
@Override
public void run() {
try {
System.out.println("Thread " + id + " is waiting for a permit.");
semaphore.acquire();
System.out.println("Thread " + id + " acquired a permit.");
// Simulate some work with a sleep
Thread.sleep(2000);
System.out.println("Thread " + id + " releasing a permit.");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
В этом примере создается семафор, который позволяет одновременно работать трем потокам. Остальные потоки будут ждать, пока не освободится разрешение. Каждый поток выполняет работу (симулированную с помощью
Thread.sleep(2000)), после чего освобождает разрешение, позволяя другому ожидающему потоку приступить к работе.#java #semaphore
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2