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

Cantidad de Threads al mismo tiempo

Estas en el tema de Cantidad de Threads al mismo tiempo en el foro de Java en Foros del Web. Hola, quería saber si alguien sabe cuantos threads al mismo tiempo se pueden crear, ya que necesito utilizar 1.000.000 para que para cada numero menor ...
  #1 (permalink)  
Antiguo 19/10/2014, 07:43
 
Fecha de Ingreso: mayo-2011
Mensajes: 31
Antigüedad: 13 años, 5 meses
Puntos: 0
Cantidad de Threads al mismo tiempo

Hola, quería saber si alguien sabe cuantos threads al mismo tiempo se pueden crear, ya que necesito utilizar 1.000.000 para que para cada numero menor a un millón realice un calculo preciso.
Para cada numero verifico si es un primo, pero obtengo siempre outofMemory!
Aclaro, esto pasa desde que uso threads, la aplicación anda bien y mas RAPIDO sin threads, ademas de que no se cuelga.

Gracias
  #2 (permalink)  
Antiguo 19/10/2014, 07:48
 
Fecha de Ingreso: mayo-2011
Mensajes: 31
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Cantidad de Threads al mismo tiempo

Ahora me surge la duda, si vos tuvieras que realizar el mismo calculo para 1.000.000 de numeros (un calculo para el 1, uno para el 2, uno para el 3 y asi (Siempre el mismo calculo)) deberia tener un hilo por cada ejecucion para cada numero? o Es un solo hilo?
  #3 (permalink)  
Antiguo 19/10/2014, 08:52
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 7 meses
Puntos: 31
Respuesta: Cantidad de Threads al mismo tiempo

flipante, quieres crear una aplicación para saber si el nº 1 es un número primo, una aplicación distinta para el 2, otra distinta para el 3...

No sería mucho mejor hacer una única aplicación que te diga si el número introducido es primo o no? O si quieres una lista de números primos desde el 1 hasta el 1.000.000... pues que con una única aplicación te los fuese listando?

A ver si con este código te haces una idea...

public boolean esPrimo(int numero) {
int aux;
for(int cont=2;cont<numero/2;cont++){
aux=numero%cont;
if(aux==0) return false;
}
return true;
}

Última edición por Kritik; 19/10/2014 a las 09:13
  #4 (permalink)  
Antiguo 19/10/2014, 12:12
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Cantidad de Threads al mismo tiempo

La verdad es que ni idea de cuál será el límite, pero un programa que necesita 1.000.000 de hilos paralelos, o es para la Nasa o el CERN, o está muy mal diseñado.

Una de las cosas que más me gusta de escribir en foros es que muchas veces me hacéis buscar cosas que nunca se me hubieran ocurrido.

http://java.dzone.com/articles/java-...number-threads

El código del programa dependerá de qué quieres que haga el programa y de cómo se va a usar. Si eres un poco más explícito, igual te pueden aconsejar mejor.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 19/10/2014, 21:59
 
Fecha de Ingreso: mayo-2011
Mensajes: 31
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Cantidad de Threads al mismo tiempo

A ver, tengo el codigo orientado a objetos, con una clase Primo que tiene el metodo es_primo, anda muy bien. Lo que se me pide es optimizar con Threads todos los primos del 2 al 1000000. Como Implementarian los Threads ahí entonces?
  #6 (permalink)  
Antiguo 20/10/2014, 01:28
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Cantidad de Threads al mismo tiempo

Buenas,

Cada vez que creas un thread, esto tiene un importante coste a nivel de recursos, ya que cada thread tiene su propio heap y stack de ejecucion. Por eso se te queda sin memoria.

Por otro lado lo que intentas es muy ineficiente, ya que el numero de cores de tu maquina es limitado. Ten en cuenta que cuando ejecutas muchos threads sobre un mismo core, este tiene que estar cambiando de contexto constantemente (http://es.wikipedia.org/wiki/Cambio_de_contexto)

El uso de muchos threads esta bien cuando se quieren ejecutar muchas tareas concurrentes sin dejar bloqueado al usuario. Por ejemplo un servidor, si no utilizase hilos, solo podria procesar una peticion al mismo tiempo.

Sin embargo tu caso es distinto, ya que no quieres ejecutar muchas tareas sino dividir una sola muy pesada. Esta es la diferencia entre concurrencia y paralelismo.

Lo que deberias hacer para conseguir el mayor rendimiento posible es basarte en el numero de cores de tu maquina:
Código Java:
Ver original
  1. int cores = Runtime.getRuntime().availableProcessors();

Ese es el numero de thread optimo para tu calculo.

Por otro lado, debes dividir bien las tareas. No puedes asignar a cada thread de forma secuencial.
Por ejemplo si tienes 4 cores y haces esto:
Thread 1: de 1 a 250000
Thread 2: de 250001 a 500000
[...]
Es muy mala idea ya que el algoritmo de calculo de primos es de complejidad lineal (O(n)) y por tanto, a mayor valor de n mas va a tardar. Lo mejor es que vayas asignando a cada core pequenos packs a procesar y segun vayan terminando le asignas nuevos hasta terminar.

En cualquier caso, si usas Java 8, esta chupado:

Código Java:
Ver original
  1. /**
  2.  *
  3.  * @author Profesor_Falken
  4.  */
  5. public class ParallelIsPrime {
  6.     private boolean isPrime(long n) {
  7.         return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
  8.     }
  9.    
  10.     private void printPrimes() {
  11.         long[] primos = range(1, 1_000_000).parallel().filter(this::isPrime).toArray();
  12.         for (int i = 0; i<primos.length; i++) {
  13.             System.out.println(primos[i]);
  14.         }
  15.     }
  16.    
  17.     public static void main(String[] args) {        
  18.         new ParallelIsPrime().printPrimes();
  19.     }
  20. }

Un saludo
__________________
If to err is human, then programmers are the most human of us

Etiquetas: Ninguno
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 09:07.