Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    20

    Terminare thread bloccato

    Salve a tutti,
    mi servirebbe una conferma da voi che sicuramente siete più esperti di me in Java

    Vi spiego il mio problema: nel run di un thread ho una chiamata al write di un OutputStream che sotto certe condizioni è bloccante (es. col debugger rimane fermo per 1-2 minuti prima di terminare). Bene, io vorrei terminare questo thread se per esempio il thread non è terminato entro 30 secondi.

    Come risolvereste questa situazione??

    Io ho provato a invocare l'interrupt() sul thread! Infatti nel run del thread ho l'eccezzione InterruptedException come dovrebbe essere!
    Bene li dovrei invocare il close sull'OutputStram o fare altro?

    Spero di essere stato un poco poco chiaro

    Grazie
    ciaoo

  2. #2
    Sbaglio o dovrebbe occorrere un exception anche della scrittura fallita? Anzi, perché invece di killare il Thread (operazione non consigliata, non si killa mai un Thread), non lo fai terminare naturalmente?

    Magari chiudi il file/socket che sia e fai uscire il Thread senza killarlo.. risolveresti tutti i problemi.
    CrystalSoft | Software House & Web Agency di WinRefine, Mercante in Fiera e altro...
    Annunci Zoo | Annunci gratuiti per il mondo degli Animali
    ElettroMercatino | Annunci a tema Informatico ed Elettronico

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    20
    Grazie!

    Ho proceduto così: quando scatta un TimerTask invoco il mio metodo Termina() della mia classe MyThread in cui viene fatto

    VariabileOutputStream.close();
    VariabileOutputStream = null;

    Nel run di MyThread catturo IOException e NullPointerException.

    Non ho capito perchè ma se nella mia funzione Termina() faccio solo il close, non succede niente (non ho neanche una IOException).
    Ma mettendo ANCHE VariabileOutputStream = null, ho una NullPointerException ed esco dal run! (in effetti se dall'esterno controllo VarMyThread.isAlive() ottengo false!, quindi il thread è terminato effettivamente)

    E' corretto quello che ho fatto? In questo modo non ho killato il thread

    Grazie mille
    ciaoooo

  4. #4
    Suppongo tu ti trova dentro un ciclo no?

    Posta uno stralcio di codice così capiamo bene il contesto e ti sappiamo dire con più precisione.
    CrystalSoft | Software House & Web Agency di WinRefine, Mercante in Fiera e altro...
    Annunci Zoo | Annunci gratuiti per il mondo degli Animali
    ElettroMercatino | Annunci a tema Informatico ed Elettronico

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    20
    Ecco il codice:


    public class TestThreadInterrupted
    {
    static public class MyThread extends Thread
    {
    Timer timer;
    OutputStream OutStream;

    //******************************
    class RemindTask extends TimerTask
    {
    MyThread m_ThToWatch;
    public RemindTask (MyThread a_Th)
    {
    m_ThToWatch = a_Th;
    }

    public void run()
    {
    m_ThToWatch.Terminate();
    }
    }
    //******************************

    public MyThread(long a_lTimer)
    {
    timer = new Timer();
    timer.schedule (new RemindTask(this), a_lTimer);
    }

    public void Terminate ()
    {
    try
    {
    OutStream.close();
    OutStream = null;
    }
    catch (IOException l_ioExc)
    {
    System.out.println("IOException in Terminate");
    }
    }

    public void run()
    {
    try
    {
    // Operazioni sull' OutStream eventualmente
    // bloccanti

    }
    catch (IOException l_ioEX)
    {
    System.out.println("IOException in run");
    }
    catch (NullPointerException l_NPEx)
    {
    System.out.println("NullPointerException in Run");
    }
    finally
    {
    System.out.println("Timer Cancel");
    timer.cancel();
    }
    }
    }



    //***********************
    public static void main(String[] args) {
    MyThread l_MyThread = new MyThread(30000);
    l_MyThread.start();

    try
    {
    l_MyThread.join();
    }
    catch (InterruptedException e)
    {
    }
    }
    }

    //******************************
    //******************************
    //******************************

    E' corretto secondo voi? Oppure ho fatto una schifezza?

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    71
    Originariamente inviato da Promo
    Ho proceduto così: quando scatta un TimerTask invoco il mio metodo Termina() della mia classe MyThread in cui viene fatto

    VariabileOutputStream.close();
    VariabileOutputStream = null;

    Nel run di MyThread catturo IOException e NullPointerException.

    Non ho capito perchè ma se nella mia funzione Termina() faccio solo il close, non succede niente (non ho neanche una IOException).
    Ma mettendo ANCHE VariabileOutputStream = null, ho una NullPointerException ed esco dal run! (in effetti se dall'esterno controllo VarMyThread.isAlive() ottengo false!, quindi il thread è terminato effettivamente)
    Il metodo close() non setta a null la variabile su cui è chiamato (nel tuo caso VariabileOutputStream). Quindi è normale non avere una NullPointerException senza. E' corretto settare successivamente tale variabile a null se si vuole catturare l'eccezione

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    20
    Quindi il codice postato secondo voi è corretto per terminare un thread bloccato in una write di un OutputStream?

    Come potete vedere non ho chiamato interrupt() sul thread, quindi non l'ho ucciso brutalmente

    Grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    20
    Mmmmh, ho un problemino

    Ho provato col codice che avevo a casa (fin qui avevo provato con un codice di prova) come avete detto voi invocando il close sull'OutputStream mentre il run del thread sta facendo il write sull'OutputStream (bloccante).

    Praticamente ho visto che facendo close e poi mettendo null, non ho nessun risultato
    Quindi ho ripercorso la strada iniziale (forse errata?) di invocare interrupt() del thread quando scatta il mio timeont!

    Effettivamente così funziona ossia ho una IOExceptio:
    [107] Transport endpoint is not connected

    E' un'eccezione grave? Quindi questo è l'unico modo per terminare una scrittura bloccate?

    Per piacere, aiuto

    Graziee

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.