Foros del Web » Programación para mayores de 30 ;) » Java »

THREAD enviar parametros al hilo

Estas en el tema de THREAD enviar parametros al hilo en el foro de Java en Foros del Web. Que tal gente, como puedo hacer lo siguiente o una idea. Tengo un método que es un control de usuarios, que ingresan al sistema y ...
  #1 (permalink)  
Antiguo 14/11/2007, 18:14
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
THREAD enviar parametros al hilo

Que tal gente, como puedo hacer lo siguiente o una idea.

Tengo un método que es un control de usuarios, que ingresan al sistema y los almaceno en un Vector.
y después tengo otro método que lee los mensajes que envian estos usuarios.

Por lo tanto necesito hacer las dos cosas a la vez... entonces me surgió el problema.

Yo tengo un "Vector clientes" donde almaceno los clientes, y ademas leeo de ese Vector los clientes y a su vez leo los mensajes de cada cliente. Se entiende ?? recorro la lista de clientes y leo sus mensajes.

Como hago para crear un thread y enviarle por referencia mi "Vector cliente" para que vaya agregando clientes nuevos y a su vez vaya leyendo los mensajes de los clientes almacenados en ese vector!

Me parece que arme una galleta.. Saludos y gracias
  #2 (permalink)  
Antiguo 15/11/2007, 02:36
 
Fecha de Ingreso: septiembre-2007
Mensajes: 173
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: THREAD enviar parametros al hilo

Creas una clase que extienda a Thread, y le proporcionas un constructor con los parámetros que quieras, de forma que al crear el Thread sea algo como esto:

HiloNuevo hn=new HiloNuevo(vector);

hn.run();

En el run puedes hacer con ese vector lo que quieras.
  #3 (permalink)  
Antiguo 15/11/2007, 08:48
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: THREAD enviar parametros al hilo

Perfecto te entiendo y eso lo hice, pero mi duda es:

Si paso el vector y lo modifico desde el run(), tambien se modifica en mi hilo principal, osea desde donde llame al thread ? me refiero si el vector pasa como un parametro por referencia.

saludos
  #4 (permalink)  
Antiguo 16/11/2007, 03:14
 
Fecha de Ingreso: septiembre-2007
Mensajes: 173
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: THREAD enviar parametros al hilo

No, no se modifica, tu se lo pasas a una clase nueva, donde tiene como parámetro un vector, que copia al que tú has llamado. Otra cosa sería que no tuvieras parámetros en la clase y que le pasaras el vector y lo modificaras. Ahí si se modifica el vector.
  #5 (permalink)  
Antiguo 16/11/2007, 03:28
 
Fecha de Ingreso: septiembre-2007
Mensajes: 173
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: THREAD enviar parametros al hilo

Para que quede bien claro:

public class pepe extends Thread
{
Vector vector=new Vector();

public pepe (Vector juan)// Tu vector, tu array, etc...
{
vector=juan // o como lo quieras copiar, ahora no recuerdo si copiar el vector así es //como clonarlo
}

public void run()
{
//TRATAMIENTO DEL VECTOR
}
}

Así no se modifica.
  #6 (permalink)  
Antiguo 16/11/2007, 12:16
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: THREAD enviar parametros al hilo

Joya!.. yo lo que necesitaba es que se modifique el vector dentro del thread, asi que si pongo un

vector = juan

me crea un enlace y modifica sobre el vector juan.

Si no quiero que se modifique deberia haber echo juan.clone(vector)

Saludos
  #7 (permalink)  
Antiguo 16/11/2007, 12:45
 
Fecha de Ingreso: septiembre-2007
Mensajes: 173
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: THREAD enviar parametros al hilo

Si, por eso te pongo en el comentario que lo clones, porque no recordaba si esa forma de copiar era como clonarlo.

Saludos.
  #8 (permalink)  
Antiguo 18/11/2007, 15:13
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: THREAD enviar parametros al hilo

Cita:
Iniciado por Ethiel Ver Mensaje
No, no se modifica, tu se lo pasas a una clase nueva, donde tiene como parámetro un vector, que copia al que tú has llamado. Otra cosa sería que no tuvieras parámetros en la clase y que le pasaras el vector y lo modificaras. Ahí si se modifica el vector.

No es cierto. Pasarselo como parametro o pasarselo en el constructor es exactamente lo mismo. Si el Thread modifica el vector que se le ha pasado, está modificando el original. Si ambos threads modifican el vector... hay que sincronizar el acceso o habrá problemas.

S!

PD: Cuando digo "modifique el vector" me refiero al contenido. La "referencia" (en otros lenguajes llamado puntero) original no se puede modificar.
  #9 (permalink)  
Antiguo 20/11/2007, 03:43
 
Fecha de Ingreso: septiembre-2007
Mensajes: 173
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: THREAD enviar parametros al hilo

No se modifica. Si yo le paso en el constructor un Vector, tengo un atributo Vector en mi nuevo hilo, clono el que le paso y lo igualo a mi atributo, modificaré el de mi atributo, nunca el vector pasado.

Saludos.
  #10 (permalink)  
Antiguo 20/11/2007, 07:01
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: THREAD enviar parametros al hilo

Cita:
Iniciado por GreenEyed Ver Mensaje
...Si el Thread modifica el vector que se le ha pasado, está modificando el original...
Cita:
Iniciado por Ethiel Ver Mensaje
No se modifica. Si yo le paso en el constructor un Vector, tengo un atributo Vector en mi nuevo hilo, clono el que le paso y lo igualo a mi atributo, modificaré el de mi atributo, nunca el vector pasado.

Saludos.
No se modifica por que lo clonas y luego modificas el clon, no por que se lo pases en el constructor. Sería exactamente lo mismo si lo clonaras antes de pasarselo al Thread, y de hecho es la practica habitual para no depender de si la clase que recibe el parametro lo clona o no, o que lo clonaras al pasarselo despues con un setter o que lo clonaras y le hicieras un setter. La clave está en la clonación.

Si quieres asegurarte de que te lo modifiquen, no des nunca un enlace al original.

S!
  #11 (permalink)  
Antiguo 20/11/2007, 08:15
 
Fecha de Ingreso: septiembre-2007
Mensajes: 173
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: THREAD enviar parametros al hilo

Claro, pero él preguntaba por hacerlo en otro hilo, vete tú a saber para que lo necesita su aplicación, de ahí todo este jaleo.
  #12 (permalink)  
Antiguo 20/11/2007, 21:16
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: THREAD enviar parametros al hilo

Ya lo logre, como todos los parametros son pasado por referencia si modifico este en el thread tambien se modifica en el programa principal.

Saludos! y gracias
  #13 (permalink)  
Antiguo 21/11/2007, 01:29
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: THREAD enviar parametros al hilo

Hola,

Ojo si modificas el Vector desde ambas clases, ya que entonces podrías tener problemas de sincronización.

S!
  #14 (permalink)  
Antiguo 21/11/2007, 10:06
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: THREAD enviar parametros al hilo

En realidad modifico el vector en una sola clase, y en la otra la leo.

Al insertar en el vector inserto al final, y al leer leo hasta la cantidad de componentes actual.

Esto puede traer algun riesgo ?
  #15 (permalink)  
Antiguo 21/11/2007, 11:12
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: THREAD enviar parametros al hilo

En pocas palabras....

https://java.sun.com/j2se/1.4.2/docs...Exception.html

Cita:
For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it. In general, the results of the iteration are undefined under these circumstances. Some Iterator implementations (including those of all the collection implementations provided by the JRE) may choose to throw this exception if this behavior is detected.
S!
  #16 (permalink)  
Antiguo 21/11/2007, 18:57
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: THREAD enviar parametros al hilo

Entonces como puedo lograr esto.

Tengo un vector en el cual almaceno clientes, y tengo un metodo que lee los clientes de ese vector. y necesito hacer ambas cosas al mismo tiempo, agregar clientes y leer los clientes de ese vector.

Por eso utilizaba un thread para ir guardando los clientes y desde el programa principal y leeyendo estos.
  #17 (permalink)  
Antiguo 22/11/2007, 02:38
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: THREAD enviar parametros al hilo

Para eso están los mecanismos de sincronizacion. Una forma de hacerlo en este caso sería:

.- La instancia de la clase padre le pasa al Thread una referencia a si misma, no el Vector.
.- La clase padre tiene un metodo para añadir clientes, internamente se lo añade al vector.
.- La clase padre tendra un metodo para leer los clientes
.- Los dos ultimos metodos deben sincronizarse para que no manipulen el Vector a la vez, usando synchronised nombreMetodo o un bloque synchronise().

Y listo.

http://java.sun.com/docs/books/tutor...l/concurrency/
  #18 (permalink)  
Antiguo 22/11/2007, 09:46
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: THREAD enviar parametros al hilo

Es interesante pero no logro aplicarlo ya que:

-- El método que agrega clientes siempre queda a la espera de un cliente si o si, no es que ejecuta el método y sale, solo saldría si hay un cliente nuevo.

-- En cambio el método de lectura del vector siempre se ejecuta y sale.

Entonces por lo que lei y entendí, el sistema de sincronización da prioridad al método que se esta ejecutando y no ejecuta otros hasta que este no termine. Es asi ?
  #19 (permalink)  
Antiguo 22/11/2007, 12:20
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: THREAD enviar parametros al hilo

.- Mientras estas leyendo los clientes, si el Thread aparte llama al metodo de añadir cliente, se bloqueara hasta que se acaben de leer los clientes, y despues se ejecutará.
.- Si no se estan leyendo clientes, el Thread añadira el cliente y saldrá, punto.
.- Si justo cuando se esta añadiendo un cliente se llama al metodo de lectura de clientes, el thread que llame al metodo de lectura tendra que esperar a que acabe la insercion del nuevo cliente.

El que ha de llamar el metodo de añadir cliente es el Thread aparte. El metodo no queda a la espera, es el Thread el que queda a la espera al llamar al metodo, si este esta sincronizado.

Lo ultimo que dices es correcto.

S!
  #20 (permalink)  
Antiguo 23/11/2007, 02:25
 
Fecha de Ingreso: septiembre-2007
Mensajes: 173
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: THREAD enviar parametros al hilo

Puedes también utilizar una clase que detecte modificaciones estructurales sobre la colección. O sea: que si por ejemplo estás borrando a la vez que recorres el vector, te avise y el programa haga lo que quieres. Yo lo tengo hecho así en un iterador, para un caso de lista doblemente enlazada.

En tu caso, por ejemplo; puedes hacer que mientras se lee, si se detecta modificación estructural, o sea, se añaden clientes, se dispare el método de añadirClientes y el otro se pare momentáneamente.

Se logra con un entero en el iterador y otro en la clase vector de cliente, o como se llame en tu caso. SI los enteros coinciden, bien, si no, hay modificación estructural y decides lo que sea...

Saludos.
  #21 (permalink)  
Antiguo 23/11/2007, 10:29
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: THREAD enviar parametros al hilo

Me puedes decir que API es o como lo puedo encontrar porque busque como modificación estructural pero nada.

gracias
  #22 (permalink)  
Antiguo 23/11/2007, 16:02
 
Fecha de Ingreso: septiembre-2007
Mensajes: 173
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: THREAD enviar parametros al hilo

No es una clase ni una API, lo haces tú. :D

Es fácil, mándame un privado con tu email y te paso lo que necesitas.

Saludos.
  #23 (permalink)  
Antiguo 24/11/2007, 10:23
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: THREAD enviar parametros al hilo

A no ser que sea un caso especial con unos requerimientos muy complejos, no veo la necesidad de utilizar unas clases propias para poder hacer una cosa que quizá no necesites hacer.

Simplemente una opinión.
S!
  #24 (permalink)  
Antiguo 24/11/2007, 11:02
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: THREAD enviar parametros al hilo

Esta buena la idea pero me cuesta aplicarlo en java.

yo tengo una cosa asi.

Código:
public class AgregarClientes extends thread {

	private Vector clientes;

	public AgregarClientes(Vector c) {

		clientes = c;
	}

	public void run {

		Si hay nuevo cliente entonces
		{
			clientes.addElement(nuevocliente)
		}
	}

}
Código:
public class EnviadorDeMensajes {

	private Vector clientes;

.......

	private iniciarSistema {
		new AgregarClientes(clientes);
		
		while (true){
		enviarMensajes();
		}
	}

.......

	public void enviarMensajes {
	
		for (i=0, i < clientes.size(); i++)
		{
			clientes.elementAt(i).recibirmsj(msj);
		}
	}

.......
.......

}
Oviamente esta todo resumido y no completo pero esa es la idea mia.
  #25 (permalink)  
Antiguo 24/11/2007, 12:01
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: THREAD enviar parametros al hilo

¿Cual es la idea exactamente del programa? Ese "while(true)" sin condicicion de salida tiene muy mala pinta . ¿Hay alguna forma de que el Vector de clientes encoja o solo tiene opcion de crecer "ad infinitum"? ¿Que hace exactamente el metodo recibirmsj? ¿Se bloquea de alguna forma?

Así por encima, el bucle infinito, el usar un bucle con el tamaño del vector y el que ambos Threads accedan al Vector sin ningun tipo de sincronización son puntos que me preocuparían bastante.

S!
  #26 (permalink)  
Antiguo 24/11/2007, 14:54
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: THREAD enviar parametros al hilo

La idea es una especie de chat, osea uno espera clientes y a su vez envia y recibe mensajes de los clientes ya conectados.

El recibirmsj no se bloquea solo pregunta si el cliente envio un mensaje.

El problema principal es el tema de la sincronizacion del vector, creo.

Saludos y gracias
  #27 (permalink)  
Antiguo 25/11/2007, 11:12
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: THREAD enviar parametros al hilo

La sincronización del vector es fácil si solo dejas que una clase tenga una referencia al Vector y el resto accedan a el sólo a través de metodos de esa clase, ya que así puedes controlar que el acceso sea sincronizado.

La arquitectura, pues eso lo sabras tu mejor que tienes todos los requerimientos

Suerte
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:09.