Autore Topic: Distruzione thread  (Letto 1075 volte)

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Distruzione thread
« il: 28 Marzo 2012, 10:42:11 CEST »
0
Ciao a tutti...domandina semplice semplice...

come posso distruggere un thread? Ho visto che il metodo thread.destroy() è deprecato e non incluso pertanto non utilizzabile.

Io ho necessità che il thread venga distrutto alla pressione del tasto fisico "back" del terminale...solamente che le soluzioni che ho trovato in internet fanno più o meno questo:
_ dopo la creazione e prima dell'avvio settano a TRUE il thread come daemon
_ stoppano il thread quando non ne hanno più bisogno
_lasciano che sia la VM a distruggerlo alla chiusura dell'applicazione

Ma io avrei necessità di distruggerlo prima..

Come posso fare?

Grazie a tutti
Non esistono problemi, ma solo soluzioni...

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:Distruzione thread
« Risposta #1 il: 28 Marzo 2012, 11:12:19 CEST »
0
Dipende da come è implementato il thread. Se ad esempio nel metodo run() del tuo thread c'è un cliclo while con una variabile booleana puoi implementare nel thread un metodo stop() che setti quella variabile a false

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Distruzione thread
« Risposta #2 il: 28 Marzo 2012, 11:19:01 CEST »
0
si..il metodo run è composto come segue:

Codice (Java): [Seleziona]
        public void run() {
            try {
                while(true)
                    {
                        richiedi();
                        Thread.sleep(tempoRefresh);
                    }
                }catch(InterruptedException ex) {}
         }

Quindi tu mi dici di cambiare e mettere un booleano che mi stoppi il thread...ma così facendo, visto che tecnicamente la mia applicazione potrebbe creare molti thread...non è che rischio riempire le risorse con tanti thread tutti stoppati e uno solo che gira correttamente?

Ho la creazione del thread e il suo avvio contestualmente all'interno dell'onCreate dell'attività..pertanto se l'utente (per divertimento) dovesse continuare a:
_ avvia l'attività   -->creazione e avvio del thread
_ preme tasto back -->stop del thread
 e continua così non rischio la saturazione della memoria?

Ciao a tutti
Non esistono problemi, ma solo soluzioni...

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Distruzione thread
« Risposta #3 il: 28 Marzo 2012, 11:26:37 CEST »
0
Un'altra domanda sempre legata ai thread...

Per metterlo in pausa per un tempo indefinito? thread.sleep(time) lo mette a nanna per un certo tempo, mentre per "stopparlo" per un tempo indefinito senza che poi questo perda lo stato e/o venga distrutto dal Garbage collector?

E per farlo ripartire dal punto dove era arrivato?

Ciao a tutti
Non esistono problemi, ma solo soluzioni...

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:Distruzione thread
« Risposta #4 il: 28 Marzo 2012, 11:36:31 CEST »
0
Rispondo con ordine, quando lo stoppi quello dovrebbe finire ed essere liberato dal garbage collector in caso di necessità.
Per metterlo in pausa potresti utilizzare un secondo valore booleano da inserire dentro il while dove se è true esegui le operazioni altrimenti non fai nulla

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Distruzione thread
« Risposta #5 il: 28 Marzo 2012, 12:11:00 CEST »
0
Sono soluzioni eleganti e mi piacciono, ma come posso attuarle?

Voglio dire, tu parli della gestione all'interno del run() che sta all'interno del thread, ma nel mio caso ho l'evento che viene gestito esternamente (activity-->pressione del tasto back) e pertanto ho il riferimento all'oggetto thread ottenuto con

MyThread thread = new MyThread()

quindi non posso agire da dentro il thread ma da fuori...poichè appunto è esternamente che mi accorgo dell'evento della pressione del tasto o meno... spero di aver chiarito la mia esigenza

Comunque grazie per le info  :D
Non esistono problemi, ma solo soluzioni...

Offline djdedo

  • Utente normale
  • ***
  • Post: 209
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
Re:Distruzione thread
« Risposta #6 il: 28 Marzo 2012, 12:18:56 CEST »
0
Se tu il thread lo istanzi nella activity mettendolo come attributo della activity puoi controllarlo da qualunque metodo tu crei quindi richiamare un thread.stop() quando ne hai necessità

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Distruzione thread
« Risposta #7 il: 28 Marzo 2012, 13:42:43 CEST »
0
aspetta mi sto perdendo...

io ho l'activity che istanzia il thread e lo fa partire con thread.run()
All'interno del run ho il ciclo while che ho scritto prima...

dopodichè all'interno dell'activity che ha creato suddetto thread ho la necessità di metterlo in pausa e di farlo ripartire senza che questo in qualche modo cambi di stato o venga distrutto...

ho pensato di usare
thread.interrupt() --> per la pausa lunga un tempo indefinito in quanto aspetta un certo evento proveniente dall'utente
thread.run() --> per risvegliarlo quando l'evento accade

può andare bene oppure ciò che faccio non è quello che vorrei fare?
Non esistono problemi, ma solo soluzioni...

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Distruzione thread
« Risposta #8 il: 28 Marzo 2012, 14:03:51 CEST »
0
ho pensato di usare
thread.interrupt() --> per la pausa lunga un tempo indefinito in quanto aspetta un certo evento proveniente dall'utente
thread.run() --> per risvegliarlo quando l'evento accade

può andare bene oppure ciò che faccio non è quello che vorrei fare?

Per implementare la "pausa lunga un tempo indefinito in quanto aspetta un certo evento proveniente dall'utente" potresti usare i lock.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Distruzione thread
« Risposta #9 il: 02 Aprile 2012, 16:43:20 CEST »
0
Mi scuso per aver lasciato in sospeso la discussione, ma in questi giorni non ho avuto altri impegni e quindi nonh o potuto provare le soluzioni che voi gentilmente mi avete suggerito... :-D

thread.stop() per stopparlo e lasciare che poi il garbage collector lo cancelli quando preferisce...è deprecato...

trovo incredibile che no via un metodo per ditruggere un thread...

Ciao a tutti
Non esistono problemi, ma solo soluzioni...

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Distruzione thread
« Risposta #10 il: 02 Aprile 2012, 16:57:24 CEST »
0
trovo incredibile che no via un metodo per ditruggere un thread...

Il metodo corretto per terminare un thread, è farlo uscire dalla run() in modo naturale.

Metodi come stop() sono devastanti per l'integrità di dati e oggetti, a maggior ragione in presenza di cpu multi-core. E' un po' come spegnere il PC con arresta il sistema o staccando la spina dalla presa.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Distruzione thread
« Risposta #11 il: 02 Aprile 2012, 16:59:00 CEST »
0
ah ok....allora troverò un modo per farlo arrestare in modo naturale senza danni :-D

Grazie infinite per l'aiuto
Non esistono problemi, ma solo soluzioni...

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Distruzione thread
« Risposta #12 il: 03 Aprile 2012, 10:12:37 CEST »
0
Ciao a tutti sono ancora qui a tediarvi con questa faccenda, ma ieri mentre cercavo di implementare le vostre richieste...

Il mio thread richiede i dati dalla rete pertanto l'istruzione di lettura mi blocca l'esecuzione fintanto che non legge qualcosa dal buffer di input...

Quello che vorrei è che dopo un certo TIMEOUT il thread si bloccasse...ma come posso contare il tempo internamento al thread se il thread stesso è bloccato in attesa di leggere qualcosa dal buffer d'ingresso?

Avevo pensato a una gestione asincrona che contasse il tempo (usando AsyncTask), ma la domanda permane...come posso sbloccare l'esecuzione del thread dalla funzione di lettura del buffer d'ingresso e consentire così al thread di uscire in modo pulito dal run?

Non esistono problemi, ma solo soluzioni...

Offline Zappescu

  • Utente junior
  • **
  • Post: 110
  • Respect: +7
    • Mostra profilo
    • Tic Tank Toe
  • Dispositivo Android:
    HTC Magic
  • Play Store ID:
    Zapmobilegames
  • Sistema operativo:
    Win XP
Re:Distruzione thread
« Risposta #13 il: 03 Aprile 2012, 10:17:14 CEST »
0
Ciao Lomba,
così, a naso, ti direi di usare un handler che gestisca la chiusura del thread quando ti va. L'handler genera il messaggio di chiusura quando identifica internamente la condizione di cui necessiti.
Spero ti basti, dipende un po' dalla tua implementazione. Io per esempio uso un handler per chiudere il thread dello splashscreen dopo che ho caricato tutte le variabili dell'onCreate.
Zapmobilegames website
Tic Tank Toe: a new approach for a classic game

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Distruzione thread
« Risposta #14 il: 03 Aprile 2012, 10:28:35 CEST »
0
La soluzione sensata, che potrebbe comunque non funzionare se sei in attesa di un dato, è questa:

1- come ti è stato suggerito setti una variabile false in modo da far terminare il thread naturalmente.
2- SUBITO DOPO chiami Thread.interrupt() che chiede al thread di interrompersi
3- all'interno del while nella run del thread gestisci una interruptedexception non facendo niente, in quel modo se viene generata una eccezione "riparti" dal prossimo while, ma avendo settato la variabile di controllo a false, il tuo thread esce naturalmente.

Se nemmeno questo funziona, non ti resta che fare una cosa drastica: disabilitare la connessione.

In questo modo il tuo thread dovrebbe restituire un errore di rete (suppongo sollevare una eccezione)... e si torna al punto di partenza.

In definitiva il consiglio è:

1- setta la variabile di controllo a false
2- chiama interrupt
3- disabilita l'accesso internet

Su wifi disabilitare l'accesso è semplice, su 3g meno.

Sembra che qualcuno ottenga questo risultato utilizzando un trucco, cambiare APN e poi rimetterlo.


 apndroid -
 
 
 Mobile data switch for Android - Google Project Hosting