Visualizzazione dei risultati da 1 a 6 su 6

Discussione: thread problem

  1. #1

    thread problem

    Salve ragazzzi ho un problema e non so nemmeno se esiste la soluzione.In breve il problema è che ho una classe dalla quale eseguo un thread e vorrei che l'esecuzione del thread fosse asincrona dal metodo come tutti i thread che si rispettino e le eccezioni fossero invece sincrone con la classe chiamante.Per spiegarmi meglio,vorrei che quando si verifica un eccezione all'interno di un thread l'ecezione deve essere propagata anche alla classe che ha generato il thread in modo da interromperne l'esecuzione di tale classe.Grazie in anticipo ammesso che esista una soluzione.

  2. #2
    Non credo che tu possa, anche perche' la firma del metodo run di Thread o di Runnable non prevede che venga lanciata alcuna eccezione, quindi qualunque cosa avvenga te la gestisci con un try catch dentro al run. Sbaglio?

    Nulla ti impedisce comunque di passare un riferimento alla classe che fa partire il thread al thread stesso, e qualora qualcosa avvenga, chiami un certo metodo su quella classe.
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

  3. #3
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Il fatto che la tua classe di partenza sia in esecuzione mi fa pensare a un ciclo di while che continua fino al verificarsi di una certa condizione. Fino a quando va tutto bene la condizione è vera. Quando capita l'eccezione, la condizione diventa falsa e il while termina.

    Così al volo mi viene in mente questa soluzione (non garantisco la conformità con gli standard architetturali vigenti):

    Il thread cattura le eccezioni e nella clusola di catch viene invocato un metodo statico della classe di partenza ( public static void bloccaEsecuzione() )

    La classe di partenza avrà una variabile statica (private static boolean inEsecuzione) che inizialmente sarà settata a true e che è la condizione di esecuzione del ciclo di while menzionato prima.
    Il metodo bloccaEsecuzione setta inEsecuzione a false. In questo modo la classe di partenza dovrebbe terminare l'iterazione di while in esecuzione e poi bloccarsi.

    Sulla carta mi sembra che possa funzionare. In pratica...
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

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

    Re: thread problem

    Originariamente inviato da magemello
    vorrei che quando si verifica un eccezione all'interno di un thread l'ecezione deve essere propagata anche alla classe che ha generato il thread
    Questo no ... direttamente no. Non si può catturare una eccezione lanciata nel contesto di un altro thread!

    Puoi fare in modo che il tuo thread abbia un reference alla classe che vuoi e che quando si verifica una eccezione, venga invocato un metodo di quella classe (che farà poi quello che vuoi). Praticamente una "callback".

    Oppure a seguito di una eccezione il tuo thread setta una qualche variabile di istanza, che l'altra tua classe andrà a testare (dipende ovviamente da cosa/come opera ...).

    Sono questioni di "design" da valutare molto bene ... e senza sapere di preciso cosa devi fare e sopratutto il perché non saprei dire altro o consigliare qualcosa di preciso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    avevo pensato anche io asettare una variabile e a mettere un ciclo di attesa sulla variabile

    codice:
    public class ActionTimer implements Interceptor{   
    	
           private Timer timer;
           int flag=1;
           String s=null;
      	
           public String intercept(ActionInvocation next) throws Exception {   
    
           timer=new Timer();
        
            this.timer.schedule(new SvegliaIntercept(),1000);
           
            s=next.invoke();
           
            while(flag==1)
            System.out.println("pagina caricata correttametne");
    
            timer.cancel();
    
            return s;   
        }   
        
        class SvegliaIntercept extends TimerTask {
                 public void run() {
    			flag=2;
    			return;
        }
    		
        }  
        public void init() {   
        }   
        public void destroy() {   
        }   
    }
    quando parte il thread se mi va in loop dentro "next.invoke();" non arriverò mai sul while è la classe rimarrà bloccata in loop,per questo volevo generare un eccezione in maniera da interrompere l'esecuzione.

  6. #6
    vorrei precisare che se si passaun riferimento alla classe chiamante (cioè quella che genra un altro thread).

    il codice verra eseguito comunque all interno del thread che ha generato l'eccezione e non nel thread del chiamante.

    o sbaglio ?

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.