Articoli Manifesto Tools Links Canali Libri Contatti ?
Tip / Java

Threads, uno sporco trucchetto

Abstract
Stream e Thread, in Java, non sono necessariamente stati sempre buoni amici. In particolare su operazioni bloccanti, un Thread può risultare sospeso per molto tempo e potrebbe essere necessario distruggerlo.
Data di stesura: 19/11/2007
Data di pubblicazione: 19/11/2007
Ultima modifica: 19/11/2007
di Stefano Fago Discuti sul forum   Stampa

Fino al JDK 1.3, questo discorso significava, in generale, attuare una INTERRUPT del Thread ed una chiusura dello Stream incriminato: solo così era possibile uscire dall'impasse!

Questo discorso si traduceva in una gestione esplicita delle risorse pericolose, o l'uso di tecniche come i Dynamic Proxy per automatizzare un pò il tutto!

Con il JDK 1.4 e l'avvento del NIO è stato introdotto il concetto di Interruptible, cioè di elemento interrompibile e relativi Canali(concetto di Channel). Grazie alla classe Channels, è possibile passare da una Stream classico ad un Canale interrompibile: il vantaggio sta nel fatto che questa volta la interrupt di un Thread, sblocca effettivamente il flusso, chiudendo il canale!

Cosa si può fare, se però volessimo salvare lo Stream(lasciarlo aperto), e interrompere il Thread?

Uno sporco trucco c'è! Ed ecco il codice:

public class Worker extends Thread
{
  // 
  private InputStream in;

  public void setIn(InputStream in)
  {
    this.in = in;
  }

  public InputStream getIn()
  {
    return this.in;
  }

  public void run(){
    try{
      ...
      in.read();
      ...
    }catch(Exception exc){}
    }
  }
}


public class Utils
{
  public static inputStream veryDirtyInterrupt(Worker t)
  {
    try{
      t.stop();
    }catch(Error err){
    }catch(Exception exc){
    }

    return t.getIn();
  }
}
Il trucco sta nel fatto che le invocazione del DEPRECATO stop, non partecipano alla nuova struttura degli Interruptable(O implementazione native di interrupt() e,quindi, lo Stream rimane aperto ed il Thread muore.

Sporco ... sporco ... trucco ... ma chissà ... potrebbe servire!

Informazioni sull'autore

Stefano Fago, classe 1973. Diplomato in ragioneria, ha conseguito il Diploma di Laurea in Informatica con un progetto legato alle interfacce grafiche soft-realtime in Java. Dopo esperienze in Alcatel ed Elea, ha svolto attività di consulenza come Software Developer e Trainer alla ObjectWay S.p.A. sede di Milano. Attualmente Software Designer presso la sezione Innovazione e Attività Progettuali di BPU Banca. Appassionato del linguaggio Java e di tutte le tecnolgie Object Oriented. Polistrumentista dilettante.

È possibile consultare l'elenco degli articoli scritti da Stefano Fago.

Altri articoli sul tema Tip / Java.

Discuti sul forum   Stampa

Cosa ne pensi di questo articolo?

Discussioni

Questo articolo o l'argomento ti ha interessato? Parliamone.