Compito Sistemi in Java

di il
38 risposte

38 Risposte - Pagina 3

  • Re: Compito Sistemi in Java

    Nella traccia non c'è la classe Prenotazione ma la Classe Sportello che secondo me dovrebbe fare la stessa cosa della classe Prenotazione. Poi non saprei
  • Re: Compito Sistemi in Java

    Kirito ha scritto:


    Nella traccia non c'è la classe Prenotazione
    La questione fondamentale per l'esercizio: la coda a priorità. Deve essere una struttura dati (una del framework o una tua, dipende cosa ti è permesso) ... ma quali oggetti ci metti dentro?
    Io pensavo oggetti Prenotazione.

    Anche perché poi come fai il meccanismo della attesa? Il thread-paziente deve andare in "sospensione". Questo NON lo fai con synchronized (cioè non da solo) ma lo fai come minimo con i wait/notify degli oggetti. Ma il wait deve basarsi su una condizione (da testare in ciclo) che deve "reggere" affinché il thread resti in sospensione. Ma questa condizione deve essere memorizzata da qualche parte! Io pensavo sempre in Prenotazione.
  • Re: Compito Sistemi in Java

    La questione fondamentale per l'esercizio: la coda a priorità. Deve essere una struttura dati (una del framework o una tua, dipende cosa ti è permesso) ... ma quali oggetti ci metti dentro?
    Io pensavo oggetti Prenotazione.
    Io non so come implementare "questi oggetti prenotazione".
  • Re: Compito Sistemi in Java

    Anche perché poi come fai il meccanismo della attesa? Il thread-paziente deve andare in "sospensione". Questo NON lo fai con synchronized (cioè non da solo) ma lo fai come minimo con i wait/notify degli oggetti. Ma il wait deve basarsi su una condizione (da testare in ciclo) che deve "reggere" affinché il thread resti in sospensione. Ma questa condizione deve essere memorizzata da qualche parte! Io pensavo sempre in Prenotazione.

    Scusami andbin ma qui devi aiutarmi tu. Nel codice ho messo il commento "// cosa devo scrivere qui?" proprio perchè non so come e cosa devo scrivere quello che mi hai detto in questo sms qui sopra. Me lo scrivi tu guardando il mio codice e leggendo la traccia?
  • Re: Compito Sistemi in Java

    Kirito ha scritto:


    Scusami andbin ma qui devi aiutarmi tu. Nel codice ho messo il commento "// cosa devo scrivere qui?" proprio perchè non so come e cosa devo scrivere quello che mi hai detto in questo sms qui sopra. Me lo scrivi tu guardando il mio codice e leggendo la traccia?
    Alt, facciamo un passo indietro.

    Allora: il thread-paziente invoca salaAttesa e deve restare "bloccato" qui dentro (vuol dire che il thread va proprio in sospensione, non usa più CPU), è quello che io ho capito, giusto?

    Poi il thread-medico invoca avantiAltro. Qui non mi è chiaro se si deve fare tutto in avantiAltro o magari (meglio) se semplicemente tira fuori "qualcosa" relativo alla prenotazione/paziente ed è poi il run() del Medico che "simula" la visita.
    Ma comunque alla fine della visita quel thread-paziente che era in sospensione va risvegliato, in modo che possa uscire dal salaAttesa e fare "altro" (cosa?).

    Ora: questo meccanismo di attesa e poi risveglio, se non lo si fa con costrutti di alto livello offerti dal framework, lo si fa come minimo con il wait/notify degli oggetti. Conosci questo concetto? Se sì ok. Se no vuol dire che non hai le basi e devi (ri)vedere questa parte.
  • Re: Compito Sistemi in Java

      class threadRaceTest {
        /**
         * @return
         * -1 : almeno uno dei due thread e' stato interrotto
         * 1 : thread 1 finito per primo
         * 2 : thread 2 finito per primo
        */
        public static synchronized int threadRace (Runnable r1, Runnable r2) {
          Thread t1 = new Thread(r1);
          Thread t2 = new Thread(r2);
          int value = -1;
          try {
            t1.start();
            t2.start();
            t1.join();
    
            if( t2.isInterrupted() ) return value;
    
            if( t2.isAlive() ) value = 1;
            else value = 2;
    
          } catch(InterruptedException e) {
               e.printStackTrace();
          } finally{
               return value;
          }
        }
    
        public static void main(String[] args) {
          Runnable r = new Runnable() {
            public void run() { }
          };
    
          System.out.println(threadRace(r, r));
        }
      }
    Andbin avevo letto tempo fa questo codice.
    In questo codice viene implementata con una classe locale l’interfaccia Runnable. Il metodo threadRace fa partire due thread con l’interfaccia appena creata e mette in attesa il primo thread finchè il secondo thread non viene interrotto o terminato. Quando il primo thread riprenderà il controllo effettua i dovuti controlli per determinare se è terminato prima il primo thread o il secondo thread.
    Come posso fare la stessa cosa per la mia classe Prenotazione? Se si mi dai una mano?
  • Re: Compito Sistemi in Java

    public class ThreadA {
        public static void main(String[] args){
            ThreadB b = new ThreadB();
            b.start();
     
            synchronized(b){
                try{
                    System.out.println("Waiting for b to complete...");
                    b.wait();
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
     
                System.out.println("Total is: " + b.total);
            }
        }
    }
     
    class ThreadB extends Thread{
        int total;
        @Override
        public void run(){
            synchronized(this){
                for(int i=0; i<100 ; i++){
                    total += i;
                }
                notify();
            }
        }
    }

    Secondo me mi viene più facile prendere come esempio questo codice...tu che ne dici?
  • Re: Compito Sistemi in Java

    Kirito ha scritto:


    Andbin avevo letto tempo fa questo codice.
    Quel codice non c'entra nulla con il meccanismo offerto dal wait/notify degli oggetti.

    E comunque non è nemmeno sensato (per quello che "pretende" di voler fare). Perché eseguito il t1.join() siamo sicuri (questo è garantito) che t1 è di certo terminato.
    Ma t2 potrebbe aver finito anch'esso prima del t1.join() o potrebbe terminare poco dopo (tra t1.join() e if(t2.isAlive()) ).
    E quindi .... non testi e "provi" un bel niente che abbia senso.
  • Re: Compito Sistemi in Java

    Kirito ha scritto:


            synchronized(b){
                try{
                    System.out.println("Waiting for b to complete...");
                    b.wait();
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
     
    Neanche questo è appropriato al 100%. il wait() andrebbe messo in un ciclo che deve testare una condizione che è quella che DEVE "reggere" affinché il thread resti in attesa.
Devi accedere o registrarti per scrivere nel forum
38 risposte