Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JAVA] Aiuto per te4rminazione thread

    Chiedo scusa se magari questa questione è già stata posta in passato, ma con la funzione "cerca" non sono riuscito a trovare nulla di utile.

    Ho un thread nel cui metodo run faccio:

    while (true)
    {
    Socket client = server.accept();
    System.out.println("Connessione da: "+ client.getInetAddress());
    }

    Ho la necessità di stoppare il thread quando non voglio più ricevere le connessioni dai client (dopo un certo tempo che dipende da altri fatti).

    Siccome il mio thread è bloccato sulla accept, come posso fare per terminarlo "legalmente" chiudendo pure la socket e quindi liberando la porta su cui questa era attaccata?

    So che i metodi stop ecc sono deprecated, ma non posso utilizzare un flag dal momento che il thread è bloccato sulla accept.
    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Semplice: togli il true e metti una variabile booleana che controlla il ciclo while.
    Quando decidi di non accettare più connessioni, setti a false la variabile, così invece di abdare sulla prossima accept() esce dal metodo run().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Si, ma supponi che il thread sia bloccato sulla accept. Seppure metto un flag al posto di true nel while che setto a false questo verrà controllato solo alla prossima iterazione, e cioè solo se mi sblocco dalla accept (il che significa che ho avuto una nuova connessione). E se nessun altro si connette che faccio?

    Mi spiego meglio. Il thread si starta automaticamente quando lo creo in una altra classe. Il fatto di non accettare più connessioni dipende da avvenimenti che succedono in questa altra classe. Se il thread è bloccato su una accept e da li in poi nessun altro mi si connette più (potrebbe succedere) quello mi rimane bloccato su quella istruzione.
    Avevo pensato di chiamare thread.interrupt() in quest'altra classe, e gestire la interruptedException nel corpo while del metodo run attraverso un try catch nel cui catch chiudevo anche la socket. Ma è impossibile, poichè non posso catturare una eccezione che non è mai "thrown in body of corrispondent try statement".
    Grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    E' per questo che bisogna stare attenti con la programmazione client/server.
    I controlli vanno fatti prima delle accept: se entri nella accept() gli unici modi per uscirne sono

    1) Arriva una richiesta di connessione da un client
    2) La accept() va in errore per chissà quale motivo
    2) La accept termina perchè è stato impostato un timeout
    3) L'applicazione termina.

    Non hai vie di scampo: devi sapere prima della accept se accettare altre connessioni o meno, oppure impostare un TimeOut (con il metodo setSoTimeout() della Serversocket).

    Se non sai a priori questa cosa e non setti un timeout, l'unica tua possibilità è inserire la accept() in un thread separato che, all'occorrenza, venga "ucciso" brutalmente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.