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

Problema con Hilos (Thread)

Estas en el tema de Problema con Hilos (Thread) en el foro de Java en Foros del Web. Hola soy nuevo en esto de los hilos, mi duda es la siguiente: Tengo que hacer para un conjunto de individuos, actualizar unos vectores, por ...
  #1 (permalink)  
Antiguo 18/06/2010, 04:46
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 9 meses
Puntos: 0
Problema con Hilos (Thread)

Hola soy nuevo en esto de los hilos, mi duda es la siguiente:
Tengo que hacer para un conjunto de individuos, actualizar unos vectores, por lo tanto creo un hilo para cada individuo pasandole al constructor el numero de individuo "i". De esta forma cada Hilo se preocupara en la clase SpacesThreads de realizar todas las operaciones sobre una posición de memoria en los vectores distintas. Mi primera duda es como recupero el vector individuosSpaces que se va modificando por cada hilo de forma independiente en la clase SpacesThreads. Lo segundo es que como controlo toda las variables globales declaradas en la clase SpacesThreads a la cual van accediendo los hilos, y si cada hilo instancia su propio vector y no es necesario controlar eso.

public class Principal()
{
public Principal()
{
for(int i=0;i<individuos.size();i++)
{
SpacesThreads S1=new SpacesThreads(individuos,bins,L,W,i);
S1.start();
individuosSpaces=S1.individuosSpaces;
}
}

public class SpacesThreads extends Thread{
{
static Vector <Vector> individuosSpaces;
static Vector <Vector> binsSpaces;
static Vector <Space> spaces;

public SpacesThreads (Vector<int[][]> individuos,Vector <int[]>bins,int lenght,int width,int posicionIndividuo)
{
}
public void(run)
{
//body
}



El codigo es un resumen de la estructura general.


Gracias
  #2 (permalink)  
Antiguo 18/06/2010, 12:37
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Respuesta: Problema con Hilos (Thread)

Para evitar problemas, lo mejor es minimizar el número de cosas que los distintos hilos han de compartir. Por ejemplo, en vez de pasarle un indice y hacerle acceder a un sitio para obtener un objeto, lo mejor es pasarle directamente el objeto. Así cada hilo tiene sus datos y te evitas un acceso a un recurso compartido.
De la misma forma, el uso de variables globales y estáticas desde los hilos no es nada recomendable.
Lo mejor es que cada hilo tenga sus propios datos, haga su trabajo lo más independientemente que pueda de los demás y que cuando tenga que acceder a algo compartido, lo haga de forma controlada (monitores, etc.) para evitar conflictos con otros hilos.

Es un tema algo complejo para lanzarse, así que suerte y si no lo has podido hacer ya, yo buscaría algun libro o tutorial como el "Concurrent Programming in Java" ya que no es un tema fácil de pillar sin una buena base.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 22/06/2010, 11:16
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Problema con Hilos (Thread)

Vale, gracias. Ya me estoy defendiendo.

Una pregunta:

Con un procesador de 4 nucleos, cual es el número recomendado de hilos a usar para que realmente se gane tiempo al realizar un bucle con hilos. Por ultimo tengo la duda de a la hora de paralelizar un bucle cual de los tres casos es mas apropiado. En el caso1 usamos 4 hilos, esperamos que finalicen y usamos otros 4 hilos, cada hilo ejecuta una tarea. En el caso dos cada hilo ejecuta una tarea y hay tantos hilos corriendo a la vez como tareas(siempre que la MVJ nos deje) y en el caso 3 dividimos las tareas en 4 bucles y cada hilo ejecuta 25 tareas.

//caso1
for(i=0,i<tareas,i++)
{
hilo(i);
hilo(i+1);
hilo(i+2);
hilo(i+3);
}

//caso2
for(i=0,i<tareas,i++)
{
hilo(i);
}

//caso3
tareas=100;
hilo(1){for(i=0,i<25,i++){tarea(i);}}
hilo(2){for(i=25,i<50,i++){tarea(i);}}
hilo(3){for(i=50,i<75,i++){tarea(i);}}
hilo(4){ for(i=75,i<100,i++){tarea(i);}}
  #4 (permalink)  
Antiguo 22/06/2010, 11:43
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Respuesta: Problema con Hilos (Thread)

Lo más flexible en estos casos es tener una cola donde se meten las tareas y crear n hilos que vayan cogiendo de la cola a medida que estén libres. Así el grado de utilización de los Threads es máximo y se crean un número controlado de Threads.

El número de Threads a usar depende de las tareas que hagan ( no es lo mismo procesos que saturen la CPU que procesos que tengan que esperar I/O), de lo cargado que vaya el S.O., del tipo de threads que use la JVM (si los threads son procesos internos, toda la JVM corre en un sólo proceso aunque haya 4 procesadores). Lo que se suele recomendar en estos casos son las pruebas empíricas simulando la carga típica para hallar un número adecuado. Y lo suyo es poder hacerlo configurable para poder modificarlo en caso necesario.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 23/06/2010, 04:06
 
Fecha de Ingreso: febrero-2010
Mensajes: 15
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Problema con Hilos (Thread)

De acuerdo, muchas gracias.
En mi caso no es necesario a esperar a que haya tareas pendientes, puesto que lo que quiero hacer es hacer unos calculos sobre dos vectores que tengo almacenados y guardar el resultado del calculo en un tercer vector. El uso de los hilos es para acceder a las distintas posiciones del vector de forma paralela para hacer los calculos de forma paralela.

Otra duda, si tengo este bucle en el que se crean hilos.

SpacesThreads ST=new SpacesThreads(individuosSpaces,individuos,bins,L,W ,0);
ST.start();
for(int i=1;i<poblacion;i++)
{
ST =new SpacesThreads(individuosSpaces,individuos,bins,L,W ,i);
ST.start();
}
ST.join();
individuosSpaces=ST.individuosSpaces;

Como hago para que no continue el codigo hasta que no se hayan ejecutado todos los hilos porque el join solo espera un hilo. Al ir machacandose el nombre ST. Lo de sacar la primera iteracion es para luego obtener una variable de la clase SpacesThreads, y que no me diga que puede que no este inicializada la clase.

Etiquetas: hilos, threads
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 16:36.