Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [java] thread con wait e monitor

    ciao a tutti, spero che qualcuno mi possa aiutare a capire meglio il concetto di wait() e notify().

    diciamo che ho tanti clienti che chiamano un taxi per farsi portare da un posto all'altro. clienti e taxi sono thread:

    il cliente, nel suo metodo run() chiama un metodo synchronized del taxi. In tal modo gli altri thread non possono accedere contemporaneamente a questo metodo.

    ora, voglio che il cliente "dorma" finchè il taxi non finisce il suo compito e "risvegli" il cliente (che sarà pronto ad effettuare un'altra chiamata magari per un altro taxi).

    DOMANDA 1:
    se io inserisco l'istruzione wait() nel metodo synchronized dell'oggetto Taxi faccio una cosa corretta?

    cioe': un wait a quel punto significa che "addormento" il thread che sta eseguendo quel codice (il cliente). poi quando il taxi finisce il suo compito, sempre dalla classe Taxi chiamo notify() che risveglia il cliente. giusto?

    DOMANDA 2: ho provato a dichiarare synchronized il metodo run() in modo da poter chiamare wait() all'interno del thread stesso. sembra funzionare anche cosi', ma è corretto? poi come faccio a risvegliare il thread? devo richiamare notify dal taxi?

    vi sembra piu' corretto l'approccio 1 o 2? ho scritto castronerie?? vi prego se qualcuno sa.... mi illumini!

    grazie!
    PS78

  2. #2
    dai ragazzi aiutatemi...

    riformulo la questione in modo piu' semplice e diretto.

    diciamo che ho un taxi solo e tanti clienti.

    il cliente chiama il taxi e dorme in attesa che il taxi arrivi e lo risvegli.

    dove metto la wait() per il cliente? e il notify() per risvegliarlo?

    vi pregooooo

    PS78

  3. #3
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    codice:
    class Cliente extends Thread {
       Taxi risorsa;
       public Cliente(Taxi s) {
          risorsa = s;
       }
    
       public void run() {
          if(risorsa.risorsa == null) 
             try {
                wait();
             } catch(InterruptedException e) {}
          else
             risorsa.risorsa = null;
       }
    }
    
    class Taxi extends Thread {
       Object risorsa = null;
       public void run() {
          if(risorsa != null) 
             try {
                notify();
             } catch(InterruptedException e) {}
          else
             risorsa = "la mia risorsa";
       }
    }
    
    class Main {
       public static void main(String[] args){
          Cliente utonto1 = new Cliente();
          Cliente utonto2 = new Cliente();
          Taxi cinese = new Taxi();
          cinese.start();
          utonto1.start();
          utonto2.start();
       }
    }
    dopo tanta teoria è il primo programma che scrivo, non l'ho provato quindi non garantisco

  4. #4
    uei grazie!

    provero', molto gentile!

    PS78

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.