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

    Verifica fine esecuzione di tutti i thread lanciati

    Ciao.

    In un ciclo for, lancio una serie di thread (la classe dei thread l'ho chiamata thread.Save e estende la classe java.lang.Thread). A ciascuno di questi thread passo un oggetto PreparedStatement che inizializzo prima del ciclo for e chiudo fuori (per ragioni di performance di accesso al database). Il problema è che il PreparedStatement lo devo chiudere solo dopo che tutti i thread hanno completato la loro attività per non generare una SQLException. Il controllo che ho implementato non sembra funzionare correttamente. Di seguito il codice, qualcuno saprebbe darmi una mano? grazie a tutti

    codice:
    .....
    .....
    PreparedStatement ps = ora.getPreparedStatement(insert);
    ExecutorService executor = Executors.newFixedThreadPool(numMax);
    for (int i = 0; i < conta; i++)
      executor.execute(new thread.Save(id,i,ps));
    executor.shutdown();
    executor.awaitTermination((long) 172800, TimeUnit.SECONDS);
    if (ps != null) ps.close();
    ....
    ....

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

    Re: Verifica fine esecuzione di tutti i thread lanciati

    Originariamente inviato da CrackBagato
    codice:
    .....
    .....
    PreparedStatement ps = ora.getPreparedStatement(insert);
    ExecutorService executor = Executors.newFixedThreadPool(numMax);
    for (int i = 0; i < conta; i++)
      executor.execute(new thread.Save(id,i,ps));
    executor.shutdown();
    executor.awaitTermination((long) 172800, TimeUnit.SECONDS);
    if (ps != null) ps.close();
    ....
    ....
    Tecnicamente la sequenza di shutdown e attesa (shutdown() seguito da awaitTermination()) è corretta ... è il modo "tipico" per iniziare la terminazione e attendere la fine di tutti i task.

    Ma ci sono 2 problemi a livello concettuali in quel tuo codice.

    1) Dici che la tua classe thread.Save estende Thread. Guarda che se usi un thread-pool, non sei tu che devi istanziare un java.lang.Thread!!! L'unica cosa importante è che l'oggetto che passi a execute() sia un Runnable. Di fatto Thread è un Runnable, quindi ti compila e funziona.
    Ma sappi molto bene che quello che hai fatto non ha senso. Non ti serve estendere Thread!

    2) C'è però un'altra questione molto più importante. Tu hai 1 solo oggetto PreparedStatement e lo fai usare a più thread. E questa è una pessima idea, perché non c'è scritto da nessuna parte che un PreparedStatement è "thread-safe". E quindi è estremamente pericoloso quello che hai fatto!!!

    E per tornare alla tua questione, dici "Il controllo che ho implementato non sembra funzionare correttamente". Non "sembra" funzionare ..... in che senso? Cosa noti? Una eccezione? Un risultato che non ti aspetti?
    Se dici solo non "sembra" funzionare .... non dici nulla ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ciao.

    Il problema non era nel controllo ma in un altro punto del codice in cui avevo lasciato erroneamente la chiamata al metodo close() del PreparedStatement dopo aver fatto un test ad hoc (chiudevo il PreparedStatement dentro un metodo della classe che estende java.lang.Thread).

    Sul primo punto che sollevi... non sono espertissimo di thread purtroppo. Come avrei potuto passare un oggetto Runnable senza esterndere la classe Thread con una mia classe?

    Sul secondo.... so che non è una cosa bellissima e un pò pericolosa, però ogni thread deve caricare un pdf in un campo blob di una tabella; inizializzare all'interno di ogni thread il PreparedStatement significava per ogni thread aprire una connessione verso il db(alternativa era passare la connessione, ma anche questo era pericoloso) e era non performante: cerco di salvare capra e cavoli creandomi un metodo synchronized che richiama i metodi set del PreparedStatement e fa l'execute. Se vuoi posto il codice. Hai qualche consiglio da darmi?

    Ti ringrazio per la gentilezza. Ciao

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da CrackBagato
    Sul primo punto che sollevi... non sono espertissimo di thread purtroppo. Come avrei potuto passare un oggetto Runnable senza esterndere la classe Thread con una mia classe?
    ..... implements Runnable

    Originariamente inviato da CrackBagato
    Hai qualche consiglio da darmi?
    Purtroppo JDBC lo conosco poco .... e a questi livelli un po' critici di utilizzo da più thread non ho molta esperienza.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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