Título: No entiendo planteamiento de un Thread
Publicado por: Zoik en 11 Septiembre 2013, 11:02 am
Bien estoy trasteando con sockets, y me tope con uno de los tutoriales de Chuidiang, que haría yo sin su wiki ;D. Aqui esta el link: http://www.chuidiang.com/java/sockets/hilos/socket_hilos.php HiloDeCliente.java // Implementa Runnable para poder ser lanzada en un hilo aparte public class HiloDeCliente implements Runnable { // En el constructor recibe y guarda los parámetros que sean necesarios. // En este caso una lista con toda la conversación y el socket que debe // atender. { ... } public void run () { while (true) { // Código para atender al cliente. } } }
ServidorChat.java public class ServidorChat { // Para guardar toda la conversación. public ServidorChat() { // Se crea el socket servidor // Bucle infinito while (true) { // Se espera y acepta un nuevo cliente Socket cliente = socketServidor. accept(); // Se instancia una clase para atender al cliente y se lanza en // un hilo aparte. Runnable nuevoCliente = new HiloDeCliente (charla, cliente ); hilo.start(); } } }
Mi pregunta esta en el Runnable de el bucle while, porque hace: Runnable nuevoCliente = new HiloDeCliente (charla, cliente );
No sería mas directo hacer: HiloDeCliente nuevoCliente = new HiloDeCliente(charla, cliente);
Y extender la class HiloDeCliente de Thread? Es decir porque implementa un Runnable y la pone "dentro" de un Thread puediendo lanzar un Thread directamente. Si alguien puediese explicarmelo lo agradeceria mucho. Un saludo y gracias de antemano.
Título: Re: No entiendo planteamiento de un Thread
Publicado por: Alien-Z en 11 Septiembre 2013, 12:11 pm
Mi pregunta esta en el Runnable de el bucle while, porque hace: Runnable nuevoCliente = new HiloDeCliente (charla, cliente );
No sería mas directo hacer: HiloDeCliente nuevoCliente = new HiloDeCliente(charla, cliente);
Y extender la class HiloDeCliente de Thread? Es decir porque implementa un Runnable y la pone "dentro" de un Thread puediendo lanzar un Thread directamente. Te lo pone en el comentario: HiloDeCliente.java // Implementa Runnable para poder ser lanzada en un hilo aparte public class HiloDeCliente implements Runnable { ... }
Tiene que implementar la interfaz Runnable para poder ser lanzada en un hilo distinto. Esta manera de crear el hilo... Runnable nuevoCliente = new HiloDeCliente (charla, cliente );
...se debe a que la clase Thread tiene un constructor que acepta como parámetro un objeto de tipo Runnable: ... }
Por tanto aplica polimorfismo para poder crear un hilo con ese parámetro. Aún así, el polimorfismo ya se utiliza internamente, aqui no es necesario; esto también funcionaria: HiloDeCliente nuevoCliente = new HiloDeCliente(charla, cliente);
Le mandamos un objeto de tipo "HiloDeCliente" pero el constructor debe recibir "Runnable", como "HiloDeCliente" implementa la interfaz "Runnable" (es un tipo padre) se aplica polimorfismo y tenemos el mismo resultado. Saludos.
Título: Re: No entiendo planteamiento de un Thread
Publicado por: Zoik en 11 Septiembre 2013, 12:20 pm
Bien, gracias por tu rápida respuesta. Yo lo e hecho de esta manera, sin Runnable, por eso quería saber si tal y como yo lo hago esta bien. import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swing.DefaultListModel; public class Server { private DefaultListModel<String> allMessages = new DefaultListModel<String>(); public Server(){ try { @SuppressWarnings("resource") while(true){ Socket newClientSocket = serverSocket. accept(); ThreadOfClient newClientThread = new ThreadOfClient(allMessages,newClientSocket); newClientThread.start(); } e.printStackTrace(); } } }
import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; import javax.swing.DefaultListModel; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; private DefaultListModel<String> allMessages = new DefaultListModel<String>(); public ThreadOfClient (DefaultListModel <String > allMessages, Socket socket ){ this.allMessages = allMessages; try { this.allMessages.addListDataListener(this); e.printStackTrace(); } } public void run(){ try { while(true){ String messageOfServer = input. readUTF(); synchronized(allMessages){ allMessages.addElement(messageOfServer); } } e.printStackTrace(); } } @Override } @Override String text = (String) allMessages. getElementAt(e. getIndex0()); try { output.writeUTF(text); exception.printStackTrace(); } } @Override } }
Un saludo y como siempre mil gracias ;)
|