Gestione dei thread in Java con un buon pattern

4

Questa mattina ho iniziato a scrivere una chat minima utilizzando socket e thread Java, ma ci sono voluti alcuni minuti per sperimentare molti problemi nella gestione di MVC.

Attualmente ho 3 classi:

  • Principale, questa è solo la classe principale utilizzata per avviare il controllo.
  • ChatController, lo uso per gestire le classi Model e View (questa è una classe Controller).
  • Host, una classe contenente un attributo Socket e due attributi Scanner e PrintStream per la lettura e la scrittura da e verso il socket.

Il problema qui è quale classe si estende da Thread per consentire al programma di leggere e scrivere contemporaneamente le caratteristiche. Il mio professore mi ha detto di estendere la classe ChatControl (quindi, il Controller), ma penso che sia troppo hard-coding (e inoltre, non mi piace che il metodo / attributi ereditati da Thread siano visibili dalla classe ChatController) .

Quindi è corretto estendere la classe Control da Thread per gestire il thread o dovrei considerare di implementare un'altra classe per eseguire questo problema (o anche provare altri pattern)?

Se hai bisogno di qualche fonte, trovala su pastebin .

    
posta Acsor 01.10.2013 - 18:02
fonte

2 risposte

2

Poiché sembra che tu sia limitato a MVC (ri: commento del professore), potresti voler guardare questo da una direzione leggermente diversa. Considerare una chat ricevuta e la chat da inviare come "eventi" che il controllore deve elaborare e inviare. Il controller può avere due code. Uno per elaborare le chat ricevute e uno per inviarle. Il codice di rete entra e esce da queste code. Questo è almeno il modo in cui lo guarderei perché rende la filettatura un po 'più semplice da gestire.

    
risposta data 01.10.2013 - 18:34
fonte
0

Un esercizio simile

Quello che ho fatto per un esercizio utilizzando MVC, socket e thread multipli è stato innanzitutto quello che ho chiamato i "modelli". Questo esercizio è stato chiamato Echo Client / Server perché tutto ciò che il server ha fatto è stato eco a ciò che ogni client ha inviato al server, al client che ha inviato il messaggio.

Il mio esercizio è stato un po 'più semplice di un esercizio di chat, ma i due esercizi sono molto simili per natura.

Le mie classi:

  1. La classe EchoServer, il modello per il server non ha assolutamente alcuna interfaccia utente.
  2. La classe EchoServerDaemon, solo una classe con un metodo main () per creare un oggetto EchoServer e avviare un thread per esso, una vista
  3. La classe EchoClient, il modello per il lato client con assolutamente non l'interfaccia utente
  4. EchoClientConsole, una vista della console del input / output del client
  5. La classe EchoUtils che contiene tutto ciò che serve al modello EchoServer e al modello EchoClient, come il numero di porta predefinito.

Potrei aver aggiunto classi come le seguenti classi senza molto lavoro perché le classi modello EchoServer ed EchoClient erano indipendenti dalle loro interfacce utente:

EchoServerConsole, un server con una vista della console EchoServerGUI, un server con una vista GUI o EchoClientGUI, un client con una vista della GUI

  1. Ho ottenuto il modello per primo.
  2. Quindi, ho ottenuto le viste specificate.
  3. Ho fatto durare i controller, collegando il modello e la vista.

Credo che avere più thread per un server sia praticamente obbligatorio.

Sul server, ho avuto una classe con un thread che ho chiamato ConnectionListener che è una classe interna di EchoServer. ConnectionListener chiama principalmente serverSocket.accept () e crea connessioni.

Ho anche avuto un thread per ogni connessione chiamata ConnectionServicer . Ogni connessione client era servita da un thread ConnectionServicer separato in modo che il server nel suo insieme potesse chiamare read () e write () e se il thread fosse bloccato, nient'altro si sarebbe bloccato.

Non penso che il client abbia bisogno di un thread separato a meno che tu non stia facendo qualcosa di dispendioso in termini di tempo, come il download di un file di grandi dimensioni.

Se vuoi che il mio codice sorgente sia disponibile, fammelo sapere.

    
risposta data 02.10.2013 - 23:59
fonte

Leggi altre domande sui tag