Newsgroup: it.comp.java
Titolo: [LUNGO] GCJ: errore su Thread.stop();

Salve,
ho un programma regolarmente compilato e funzionante che si pone in ascolto
su una porta con protocollo TCP. Se entro 10 secondi non gli vengono
inserite le informazioni necessarie, la connessione termina. Per fare ciò
utilizzo un sistema di timeout fatto su base Thread
Vi allego l'esempio, perdonatemi per la lunghezza del codice:
----------------------------------------
import java.io.IOException;
import java.net.Socket;
public class TimeoutNetwork extends Thread {
 /** Ogni quanto viene effettuato il controllo */
 protected int m_rate = 1000;
 private int m_length;
 private int m_elapsed;
 private String killall = "/usr/bin/killall";
 private Socket clientSocket;
 /**
   * Crea un timer con tempo di timeout passato come parametro
   * @param length Tempo prima dell'intervento del timeout
   */
 public TimeoutNetwork (Socket clientSocket, int length) {
  m_length = length;
  m_elapsed = 0;
  this.clientSocket = clientSocket;
 }
 /** Reimposta il timer al valore iniziale */
 public synchronized void reset() {
  m_elapsed = 0;
 }
 /** Metodo che implementa il timer vero e proprio */
 public void run() {
  while (true) {
   try {
    Thread.sleep(m_rate);
   }
   catch (InterruptedException ioe) {
    System.err.println(ioe);
   }
   synchronized (this) {
    m_elapsed += m_rate;
    if (m_elapsed >= m_length) {
     timeout();
    }
   }
  }
 }
 /** Viene eseguito non appena il timeout si verifica */
 public void timeout() {
  try {
   clientSocket.close();
  } catch (IOException e) {
   System.err.println(e);
   System.exit(0);
  }
 }
}
----------------------------------------
Il problema sussiste nel fatto che, dalla classe che istanzia il server,
lanciato il metodo stop(); associato all'oggetto che punta alla classe
TimeoutNetwork, tutto funziona perfettamente, ma non sui compilati gcj!
Una volta eseguito il programma binario compilato da gcj, esso genera
un'eccezione che indica Thread.stop(); come Unsupported, e il programma
termina!
Avete consigli in merito?
Ringrazio anticipatamente


http://csvtosql.sf.net

Ciao
per ovviare al problema io solitamente uso una variabile di guardia:
al posto del tuo
WHILE(TRUE)
metto
WHILE( STOSERVERNONSADAFARGIRARE )
/**** esempio *******/
booelan runServer = false
/* il Thread al quale aggancio la mia classe */
Thread t = new Thread(this)
/*
 * posso settare un timeout del socket in modo che
 * dopo tot secondi esca dalla accept lanciando una
 * eccezione...non so se ti puo' essere utile ;)
 */
public synchronized void run() {
   // ciclo di ascolto, finche' non arriva una connessione
   while ( runServer ) {
      try {
      Socket endpoint = serverSckt.accept();
      // ho una connessione la gestisco
      } catch (Exception e) {
         if (e instanceof SocketTimeoutException) {
            /* timeout del socket quello
             * impostato da me alla creazione
             */
         }else
            e.printStackTrace();
      }
      }
     /* esco dal while, sto per spegnere il server */
   try {
      serverSckt.close();
   } catch (IOException e) {
      e.printStackTrace();
   }
   t.interrupt(); /*interrompo il Thread che contiene il mio server */
}
/**
 * Start del server.
 */
public synchronized void start() {
   if (runServer == false ) {
      runServer = true;
      t.start();
   }
}
/**
 * Shutdown del server. Puo' metterci almeno 2 secondi,
 * (accept time out) dopodiche' esce dal ciclo di
 * accept e da Server#run() fermando di fatto il server.
 */
public void stop() {
   runServer = false;
}
Spero di no nessere stato troppo criptico