lever une exception JAVA
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

lever une exception JAVA



  1. #1
    kapil667

    lever une exception JAVA


    ------

    Bonjour,

    j'étudie un programme pour simuler par un programme Java le comportement d’un producteur et d’un consommateur qui s’échangent des objets via un compartiment.
    le producteur produit et le consommateur prend l'objet que le producteur à produit.


    je dois lever une exception quand le consommateur prend 2 fois le même objet dans la classe CubbyHole(compartiment), mais je ne vois pas comment déterminer si il prend 2 fois le même objet.
    Merci de votre aide.

    Voici le programme qui décrit le comportement du compartiment.



    Code:
    public class CubbyHole {
         private int contents;
         private boolean available = false;
    
         public int get() throws InterruptedException {
    	  if (available == false)
    	       return -1;
    	  available = false;
    	  randomSleep();
    	  return contents;
         }
    
         public boolean put(int value) throws InterruptedException {	  
    	  if (available == true)
    	       return false;
    	  available = true;
    	  randomSleep();
    	  contents = value;
    	  return true;
         }
    
         public static void randomSleep() {
    	  try {
    		Thread.sleep((int)(Math.random() * 10));
    	} catch (InterruptedException e) {
    		e.printStackTrace();
    	}
         }
    
    	
    }
    
    
    Programme du consommateur
    public class Consumer extends Thread {
         private CubbyHole cubbyhole;
    
         public Consumer(CubbyHole c) {
    	  cubbyhole = c;
         }
    
         public void run() {
    	  setPriority(3);
    	  int value = 0;
    	  for (int i = 0; i < 10; i++) {
    	       int times = -1;
    		do {
    		     try {
    				value = cubbyhole.get();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		     times ++;
    		} while (value == -1);
    		System.out.println("Consommateur\tprend\t" 
    				   + value + "\t" + times);
    	  }
         }
    }
    
    programme du producteur
    
    public class Producer extends Thread {
         private CubbyHole cubbyhole;
    
         public Producer(CubbyHole c) {
    	  cubbyhole = c;
         }
    
         public void run() {
    	  setPriority(Thread.MIN_PRIORITY);
    	  for (int i = 0; i < 10; i++) {
    	       int times = 0;
    	       try {
    			while (!cubbyhole.put(i)) { times++; }
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	       System.out.println("Producteur\ta mis\t" 
    				  + i + "\t" + times);
    	  }
         }
    }
    
    
    le main
    public class ProducerConsumerTest {
      public static void main(String[] args) {
        CubbyHole c = new CubbyHole();
        Producer p1 = new Producer(c);
        Consumer c1 = new Consumer(c);
    
        System.out.println("Thread actif\tAction\tObjet\tCycles d'attente");
        System.out.println(
    	 "------------------------------------------------");
    
        p1.start();
        c1.start();
      }
    }
    merci de votre aide.

    -----
    Dernière modification par JPL ; 10/12/2019 à 16h38. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. #2
    FunkyFrog

    Re : lever une exception JAVA

    Bonjour,

    Le premier problème à mon avis c'est d'utiliser des int. Je suppose que détecter qu'un élément est déjà retiré, c'est à un moment de tester l'égalité entre 2 int. Ce qui peut induire des faux positifs, sauf si on assure de ne jamais produire le même int.

    Le plus simple (et propre à mon gout) serait d'assurer que le (ou les) consommateurs retire les éléments du compartiment. De sorte que le prochain consommateur ne puisse prendre un élément déjà pris (puisque qu'il a été retiré). Par exemple en stockant les objets à consommer dans une List et faire un remove() par exemple. Et dans ce cas pas besoin de jeter une exception. Attention cependant à bien utiliser une implémentation Thread safe de List (vu que les producteurs et consommateurs sont des thread).

    Si c'est un exercice "scolaire", et que l'objectif est de détecter et jeter une exception dans ce cas précis, alors j'envisagerai 2 solutions. Soit l'objet consommé contient un boolean indiquant s'il a été consommé ou pas (Ça ne peut plus être un int, mais une classe custom avec la valeur int et le boolean isConsumed). Ce serait la solution que je préfère.
    Soit il faut maintenir un registre de ce qui est consommé ou pas, mais pareil avec des int ce ne sera pas possible si le producteur créé des int égaux. Avec un objet custom on peut enregistrer dans une collection l'objet déjà consommé. Et a chaque consommation, vérifier que l'objet n'est pas dans le registre (la collection). J'aime moins, parce que le registre va grossir avec le temps et risquer de provoquer une exception liée à la mémoire dans la JVM. A moins de purger la liste régulièrement par exemple (mais on perds l'historique du registre).

    Voila. Bonne continuation
    Dernière modification par FunkyFrog ; 26/12/2019 à 18h36.

Discussions similaires

  1. Probleme java exception
    Par ser31 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 22/07/2016, 12h05
  2. Couple ox/red exception!
    Par invitec1b6da07 dans le forum Chimie
    Réponses: 8
    Dernier message: 19/04/2009, 11h09
  3. Le dihydrogène, une exception?
    Par inviteb76f4e72 dans le forum Chimie
    Réponses: 12
    Dernier message: 22/05/2008, 20h20
  4. Java, java, java, where are you, there's a mission for you !
    Par invite1237a629 dans le forum Logiciel - Software - Open Source
    Réponses: 35
    Dernier message: 16/03/2008, 22h10
  5. Nero et une exception 0E
    Par cedbont dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 26/02/2005, 11h30