Ecrire un programme Java qui simule la production de produits dans une usine.
Il y a un nombre limité de ressources
disponibles dans cette usine (par exemple 2), et plusieurs travailleurs doivent obtenir l'autorisation pour accéder aux
ressources et faire un assemblage des produits. Chaque assemblage est réalisé par un ouvrier de l’usine et qui reste avec
une durée de 10 secondes.
Un ouvrier est un thread caractérisé par un identificateur (de type int). Son rôle est de réaliser 5 itérations d’assemblage
d’un produit. Ecrire la méthode main permettant de tester ces deux classes.
import java.util.concurrent.Semaphore;
class Factory {
private Semaphore resources;
public Factory(int numResources) {
resources = new Semaphore(numResources, true); // true pour une file d'attente ordonnée
}
public void assembleProduct(int workerId) {
try {
System.out.println("Worker " + workerId + " is waiting for resources.");
resources.acquire(); // Acquérir un permis pour les ressources
System.out.println("Worker " + workerId + " is assembling a product.");
Thread.sleep(10000); // Simuler l'assemblage du produit
System.out.println("Worker " + workerId + " has completed the product.");
resources.release(); // Libérer le permis pour les ressources
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main {
class Worker extends Thread {
public static void main(String[] args) {
private Factory factory;
int numResources = 2; // Nombre de ressources disponibles
private int workerId;
Factory factory = new Factory(numResources);
public Worker(Factory factory, int workerId) {
this.factory = factory;
Worker worker1 = new Worker(factory, 1);
this.workerId = workerId;
Worker worker2 = new Worker(factory, 2);
}
Worker worker3 = new Worker(factory, 3);
public void run() {
for (int i = 1; i <= 5; i++) {
worker1.start();
factory.assembleProduct(workerId);
worker2.start();
}
worker3.start();
}
}
}
}