Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    23

    [JAVA] sicuramente č banale...

    Salve,
    sto riprendendo i contatti con java e la programmazione dopo un po' di tempo che me ne ero allontanato per lavoro..

    Sto facendo esercitazioncine varie, e ieri sui thred ho riscontrato questo errore a RunTime, che non riesco a risolvere:
    Exception in thread "main" java.lang.IllegalMonitorStateException: current thread not owner
    at java.lang.Object.notify(Native Method)
    at it.ricca.prove.Starter.main(Starter.java:12)
    Vi illustro il codice, non so se posso aver fatto errori di importazione o di package.. visto che utilizzo anche per le prime volte NetBeans...:

    codice:
       package it.ricca.prove;
    
        public class WaitingThreadTest implements Runnable{
        String name;
        Object o;
        
        public WaitingThreadTest (String name, Object o){
            this.name=name;
            this.o=o;
        }
        
        public void run() {
            synchronized(o){
               try{o.wait();}
               catch(InterruptedException ie){}
               for(int i=0;i<4;i++)
                    System.out.println("Hy!! My name is "+name+"!!!");
            }
        }
        
        public static void main (String[] argv ) {
        Object ob =new Object();
        Thread t1=new Thread (new WaitingThreadTest("Primo", ob));
        Thread t2=new Thread (new WaitingThreadTest("secondo", ob));
        Thread t3=new Thread (new WaitingThreadTest("terzo", ob));
        
        t2.start();
        t1.start();
        t3.start();
       //Arriva fino a stampare questa frase...
        System.out.println("Siamo partiti tutti!!");
    
      //E QUESTA ULTIMA E' L'ISTRUZIONE CHE GENERA L'ERRORE
        ob.notify();
        }
    }
    
    Grazie,
    -_- faciolo

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    credo che non sia il metodo pių corretto
    in ogni caso epr chiamare notify devi essere owner dell'oggetto, ad esempio con synchronized (ob) ...
    ma il metodo giusto sarebbe chiamare notify nel run() dei thread che riescono ad avere la visione completa sul monitor

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    23
    Ok adesso gira...
    ho fatto questa semplice modifica, sostituendo all'istruzione notify(ob); la seguente:


    synchronized (ob){ob.notifyAll();};
    in questo modo si svegliano tutti e vanno a termine.

    Vediamo se ho capito bene cosa intendi per procedura corretta:
    > sarebbe meglio quindi avere un Thread "Padre" che osserva e soprattutto lancia l'esecuzione nel monitor...?



    poi logicamente questa č una piccola prova.. e lo lancio dal Main...

    Cmq accetto pareri e consigli!!!

    Riccardo.
    -_- faciolo

  4. #4
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    potrei dire cretinate (sono poco esperto in thread)
    come stai facendo tu, partono i thread, si fermano e ripartono tutti insieme
    se questo č il comportamento che vuoi, bene
    ma di solito si fa in modo che un thread esegua il codice solo in condizioni di sicurezza, ovvero se altri thread non possono accedere a dati condivisi

    diciamo che dipende dalle esigenze dell'applicazione e da comesi deve comportare

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    23
    Certo, certo... si ma infatti questo codice era giusto per vedere la concorrenza, infatti lanciando piu volte il file si ottengono sempre sequenze diverse, in quanto i 3 thread concorrono simultaneamente all'accesso del Object.
    Grazie, ciao.
    -_- faciolo

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 © 2024 vBulletin Solutions, Inc. All rights reserved.