elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  No entiendo planteamiento de un Thread
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No entiendo planteamiento de un Thread  (Leído 1,541 veces)
Zoik

Desconectado Desconectado

Mensajes: 91


Ver Perfil
No entiendo planteamiento de un Thread
« 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

Código
  1. HiloDeCliente.java
  2. // Implementa Runnable para poder ser lanzada en un hilo aparte
  3. public class HiloDeCliente implements Runnable
  4. {
  5.   // En el constructor recibe y guarda los parámetros que sean necesarios.
  6.   // En este caso una lista con toda la conversación y el socket que debe
  7.   // atender.
  8.   public HiloDeCliente(DefaultListModel charla, Socket socket)
  9.   {
  10.      ...
  11.   }
  12.  
  13.   public void run ()
  14.   {
  15.      while (true)
  16.      {
  17.         // Código para atender al cliente.
  18.      }
  19.   }
  20. }

Código
  1. ServidorChat.java
  2. public class ServidorChat
  3. {
  4.   // Para guardar toda la conversación.
  5.   private DefaultListModel charla = new DefaultListModel();
  6.  
  7.   public ServidorChat()
  8.   {
  9.      // Se crea el socket servidor
  10.      ServerSocket socketServidor = new ServerSocket(5557);
  11.  
  12.      // Bucle infinito
  13.      while (true)
  14.      {
  15.          // Se espera y acepta un nuevo cliente
  16.          Socket cliente = socketServidor.accept();
  17.  
  18.          // Se instancia una clase para atender al cliente y se lanza en
  19.          // un hilo aparte.
  20.          Runnable nuevoCliente = new HiloDeCliente(charla, cliente);
  21.          Thread hilo = new Thread(nuevoCliente);
  22.          hilo.start();      
  23.      }
  24.   }
  25. }

Mi pregunta esta en el Runnable de el bucle while, porque hace:

Código
  1. Runnable nuevoCliente = new HiloDeCliente(charla, cliente);
  2.          Thread hilo = new Thread(nuevoCliente);

No sería mas directo hacer:

Código
  1. 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.


En línea

Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: No entiendo planteamiento de un Thread
« Respuesta #1 en: 11 Septiembre 2013, 12:11 pm »

Citar
Mi pregunta esta en el Runnable de el bucle while, porque hace:

Código
  1. Runnable nuevoCliente = new HiloDeCliente(charla, cliente);
  2.          Thread hilo = new Thread(nuevoCliente);

No sería mas directo hacer:

Código
  1. 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:

Código
  1. HiloDeCliente.java
  2. // Implementa Runnable para poder ser lanzada en un hilo aparte
  3. public class HiloDeCliente implements Runnable
  4. {
  5.   ...
  6. }

Tiene que implementar la interfaz Runnable para poder ser lanzada en un hilo distinto. Esta manera de crear el hilo...

Código
  1. Runnable nuevoCliente = new HiloDeCliente(charla, cliente);
  2.          Thread hilo = new Thread(nuevoCliente);

...se debe a que la clase Thread tiene un constructor que acepta como parámetro un objeto de tipo Runnable:

Código
  1. Thread(Runnable target) {
  2.   ...
  3. }

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:

Código
  1. HiloDeCliente nuevoCliente = new HiloDeCliente(charla, cliente);
  2.          Thread hilo = new Thread(nuevoCliente);

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.


« Última modificación: 11 Septiembre 2013, 12:23 pm por Alien-Z » En línea

Zoik

Desconectado Desconectado

Mensajes: 91


Ver Perfil
Re: No entiendo planteamiento de un Thread
« Respuesta #2 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.

Código
  1. import java.io.IOException;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4.  
  5. import javax.swing.DefaultListModel;
  6.  
  7.  
  8. public class Server {
  9.  
  10. private DefaultListModel<String> allMessages = new DefaultListModel<String>();
  11.  
  12. public Server(){
  13. try {
  14. @SuppressWarnings("resource")
  15. ServerSocket serverSocket = new ServerSocket(9000);
  16. while(true){
  17. Socket newClientSocket = serverSocket.accept();
  18. ThreadOfClient newClientThread = new ThreadOfClient(allMessages,newClientSocket);
  19. newClientThread.start();
  20. }
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  26.  

Código
  1. import java.io.DataInputStream;
  2. import java.io.DataOutputStream;
  3. import java.net.Socket;
  4.  
  5. import javax.swing.DefaultListModel;
  6. import javax.swing.event.ListDataEvent;
  7. import javax.swing.event.ListDataListener;
  8.  
  9.  
  10. public class ThreadOfClient extends Thread implements ListDataListener{
  11.  
  12. private DefaultListModel<String> allMessages = new DefaultListModel<String>();
  13. private DataInputStream input;
  14. private DataOutputStream output;
  15.  
  16. public ThreadOfClient(DefaultListModel<String> allMessages, Socket socket){
  17. this.allMessages = allMessages;
  18. try {
  19. input = new DataInputStream(socket.getInputStream());
  20. output = new DataOutputStream(socket.getOutputStream());
  21. this.allMessages.addListDataListener(this);
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. }
  26.  
  27. public void run(){
  28. try {
  29. while(true){
  30. String messageOfServer = input.readUTF();
  31. synchronized(allMessages){
  32. allMessages.addElement(messageOfServer);
  33. }
  34. }
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. }
  39.  
  40. @Override
  41. public void contentsChanged(ListDataEvent e) {
  42.  
  43.  
  44. }
  45.  
  46. @Override
  47. public void intervalAdded(ListDataEvent e) {
  48. String text = (String) allMessages.getElementAt(e.getIndex0());
  49. try {
  50. output.writeUTF(text);
  51. } catch (Exception exception) {
  52. exception.printStackTrace();
  53. }
  54.  
  55. }
  56.  
  57. @Override
  58. public void intervalRemoved(ListDataEvent e) {
  59.  
  60.  
  61. }
  62. }
  63.  
  64.  

Un saludo y como siempre mil gracias ;)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Planteamiento de listas de reproducción en una web de musica
Desarrollo Web
H4RR13R 3 3,506 Último mensaje 10 Junio 2010, 06:06 am
por Nakp
#include <thread/AsyncCallback.h> #include <thread/Runnable.h>
GNU/Linux
Codename!! 1 2,868 Último mensaje 18 Agosto 2011, 07:14 am
por Foxy Rider
#include <thread/AsyncCallback.h> #include <thread/Runnable.h>
Programación C/C++
Codename!! 0 2,079 Último mensaje 15 Agosto 2011, 21:31 pm
por Codename!!
planteamiento de problema « 1 2 »
Programación C/C++
m@o_614 14 5,255 Último mensaje 3 Julio 2013, 07:16 am
por eferion
Planteamiento del problema
Programación General
dark_headhunter 1 1,608 Último mensaje 8 Septiembre 2016, 08:13 am
por Zeros1001
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines