Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Multi-threading

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    80

    Multi-threading

    Ciao!
    Sto provando a implementare una classe "implements Runnable".. All interno del main cerco di eseguire il mio unico thread..

    public static void main(final String[] args) throws InterruptedException {

    //////////
    Thread t = new Thread(new ImagesExtractorTask());
    t.start();
    //////
    }

    ho la funzione public void run(){//operazioni varie//}

    In compilazione e a runtime non da nessun genere di errore....
    il problema è che non viene lanciato il mio therad. Provando a debuggare al momento dello t.start() non viene generato nessun thread o errore, semplicemente passa all operazione successiva...Sto usando NETBEANS..

    Qualcuno sa dirmi di cosa potrebbe trattarsi?

    Grazie!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Per cominciare, posta il codice completo (se non completo perché lungo, almeno delle parti essenziali/importanti dove si vede la dichiarazione delle classi, dei metodi, ecc..) e sopratutto tra i tag CODE.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    80

    codice

    Ecco le parti più importanti..

    codice:
    public class ImagesExtractorTask implements Runnable{
    
      public synchronized void runTask() throws Throwable {
            //operazioni varie
      }
    
    
        public static void main(final String[] args) throws InterruptedException {
    
            long patience = 1000 * 60 * 60;
    
            threadMessage("Starting Extractor thread...");
            long startTime = System.currentTimeMillis();
            Thread t = new Thread(new ImagesExtractorTask());
            t.start();
    
    
            threadMessage("Waiting for Extractor thread to finish");
            while (t.isAlive()) {
                threadMessage("Still waiting...");
                //Wait maximum of 1 second for Extractor thread to
                //finish.
                t.join(1000);
                if (((System.currentTimeMillis() - startTime) > patience) &&
                        t.isAlive()) {
                    threadMessage("Tired of waiting!");
                    t.interrupt();
                    t.join();
                }
    
            }
    
        }
    
        public void run(){
            try {
                runTask();
    
            } catch (Throwable ex) {
                Logger.getLogger(ImagesExtractorTask.class.getName()).log(Level.SEVERE, null, ex);
            }
    
        }
        static void threadMessage(String message) {
            String threadName = Thread.currentThread().getName();
            System.out.format("%s: %s%n", threadName, message);
        }
    
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Tecnicamente mi sembra corretto (cioè non vedo nulla di palesemente e vistosamente errato). L'ho provato, ho solo tolto il Logger (sostituito con un banale println) e nel runTask() ho messo:

    codice:
    System.out.println("AAA");
    Thread.sleep(8000);
    System.out.println("BBB");
    Lanciando il programma ottengo:

    codice:
    main: Starting Extractor thread...
    main: Waiting for Extractor thread to finish
    AAA
    main: Still waiting...
    main: Still waiting...
    main: Still waiting...
    main: Still waiting...
    main: Still waiting...
    main: Still waiting...
    main: Still waiting...
    main: Still waiting...
    main: Still waiting...
    BBB
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    80

    dichiarare synchronized

    ok...allora sto sbagliando a debuggare con NETBEANS..un altra domanda..Non è necessario che tutti i metodi della classe siano synchronized vero? solo quelli che accedono o restituiscono risorse condivise ?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: dichiarare synchronized

    Originariamente inviato da Marco_P
    Non è necessario che tutti i metodi della classe siano synchronized vero? solo quelli che accedono o restituiscono risorse condivise ?
    Dipende da cosa è condiviso e da chi/quanti lo condividono e da cosa devi fare di preciso. Se c'è qualcosa di condiviso va certamente prestata una maggiore attenzione ... ma devi precisare meglio. In quel codice che hai postato io non vedo nulla di "condiviso" (e nemmeno più thread, a parte il main e quello avviato) e se non precisi meglio .... non so che dire...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    80

    Passaggio parametri

    Se volessi modificare il codice che ho postato sopra per poter passare i parametri al mio thread?
    Ho visto ke si può fare con ParameterizedThreadStart()..Ho provato a modificare il codice in questo modo

    codice:
            String prova="Stringa passata";
            Thread p = new Thread(new ParameterizedThreadStart(this.runTask()));
            p.start(prova);
    ma non compila..

    errore1_ cannot find symbol : class ParameterizedThreadStart
    errore2_ non-static variable this cannot be referenced from a static context
    Thread p = new Thread(new ParameterizedThreadStart(this.runTask()));
    errore3_ start() in java.lang.Thread cannot be applied to (java.lang.String)
    p.start(prova);

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    80
    Risolto..Per chi potrebbe essere interessato ecco il codice
    codice:
           Thread t = new Thread(new ImagesExtractorTask(parametro1,parametro2,parametro3));
           t.start();
    Ho aggiunto il costruttore della classe ImagesExtractor(3parametri)..

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.