import java.util.concurrent.Semaphore;
public class ResourceManagementTask implements Runnable {
private Semaphore semaphore;
private int resourceId;
public ResourceManagementTask(Semaphore semaphore, int resourceId) {
this.semaphore = semaphore;
this.resourceId = resourceId;
}
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("Thread " + Thread.currentThread().getId() + " acquired resource " + resourceId);
Thread.sleep(2000);
System.out.println("Thread " + Thread.currentThread().getId() + " released resource " + resourceId);
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class Main {
private static final int RESOURCE_COUNT = 5;
private static final int THREAD_COUNT = 10;
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
Semaphore semaphore = new Semaphore(RESOURCE_COUNT, true);
for (int i = 0; i < THREAD_COUNT; i++) {
executor.execute(new ResourceManagementTask(semaphore, i % RESOURCE_COUNT));
}
executor.shutdown();
}
}