Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 12/02/16, 09:49:55
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

Java y multihilos

Hola, necesito alguna ayuda sobre Java y los multihilos.

Estoy tratando de realizar ciertos trabajos los cuales me llevan cada uno 2 segundos y realizaré unos 500, os pódeis imaginar el costo en tiempo.

Total me he metido hacer un pool de hilos, le he metido 100 lo cual he pensado 500/100*2=10 segundos pero nada el costo sigue siendo muy alto y no tarda esos 10 ser segundos, ademas aveces me bloquea la UI

yo uso esto dentro de un asyntask
pool = Executors.newFixedThreadPool(100);

No entiendo por que se ralntiza tanto , quizas demasiados hilos?

Me podeis echar una mano sobre pools de hilos? algún buen manual para ser eficiente?


gracias gente
__________________
Responder Con Cita


  #2  
Viejo 12/02/16, 10:15:23
Array

[xs_avatar]
Dexafree Dexafree no está en línea
Mr. FAQMan
· Votos compra/venta: (1)
 
Fecha de registro: dic 2008
Mensajes: 8,021
Modelo de smartphone: Samsung Galaxy S i9000 + Galaxy Tab 10.1 WiFi
Tu operador: Movistar
La verdad es que nunca me he encontrado el caso de necesitarlo en un movil... No sería mejor delegarlo en un servidor? (No conozco el problema no se si se podrá)

He encontrado dos paginas que quizás te pueden ayudar

http://developer.android.com/intl/es.../run-code.html

http://stackoverflow.com/questions/2...ask-in-android

Si consigues sacarlo ya nos contarás como lo has hecho, porque son cosas que está bien saber por si algun dia lo necesitas!
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 12/02/16, 10:35:35
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Si el móvil tuviera 100 núcleos a lo mejor sí te valía la cuenta de 500/100 Pero los móviles, salvo que sea muy alta gama da gracias que tenga más de cuatro y que el sistema operativo te deje usar todos.

Mientras un núcleo está ocupado con un hilo no puede estar ejecutando otro, si tienes muchos hilos lo que consigues es que vaya más despacio porque tendrá que cambiar de contexto más veces.

Así que mejor tener menos hilos trabajadores (con un pool del número de núcleos va servido, 4, 6...), que ya se encarga el Executor de encolar las tareas y ejecutarlas cuando se vayan quedando libres. Entiendo que si cada tarea tarda 2 segundos es que está calculando cosas todo el rato y no hay esperas (que entonces sí tendría sentido que el pool fuera más grande)

Por cierto que si ya usas un executor te sobra el AsyncTask, el AsyncTask es para tareas cortas y ya se encargan ellas de elegir el hilo de ejecución, pero bueno, es lo de menos en este caso.

P.D: Sobre que te bloquee la UI, también es normal, si tiene 100 hilos más el hilo principal son 101, el tiempo que va a poder dedicar a cada hilo el sistema operativo va a ser ínfimo. Si no quieres que afecte a la UI hay que bajar el número de hilos, así el reparto de tiempo entre el hilo principal y el conjunto de todos los demás hilos es algo más equitativo.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!

Última edición por mocelet Día 12/02/16 a las 10:40:19.
Responder Con Cita
  #4  
Viejo 12/02/16, 10:41:02
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

Te lo agradezco, a ver si consigo la mejor manera, en teoría lo tengo bien a ver si consigo más manuales de como optimizar estas tareas.

En cuanto a lo del servidor nada, todo en local con el movil
__________________
Responder Con Cita
  #5  
Viejo 12/02/16, 10:44:32
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

Gracias mocelet

Entiendo que no podré entonces rebajar mucho tiempo mis tareas, intentare optimizar al máximo numero de hilos y menor tiempo de espera,

Por otro lado que es mejor usar un runnable + interface para que retorne datos o usar un callable directamente con retorno?
__________________
Responder Con Cita
  #6  
Viejo 12/02/16, 13:30:59
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Usar Runnable o Callable es en el fondo lo mismo desde el punto de vista de rendimiento.

Por cierto, ¿se puede saber qué son esas 500 tareas? Igual la solución es disminuir las tareas u optimizar el algoritmo, o implementarlo nativamente o como proponía Dexafree que lo haga un servidor.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #7  
Viejo 13/02/16, 13:19:27
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

Por supuesto,

Simple y llanamente son escuchas a ips con isrecheable y algun socket a puertos especificos, son unas 500 ips a analuzar ya que voy siempre contra una red con subnet 255.255.254.0

Tengo un timeout de 2 segundos
__________________
Responder Con Cita
  #8  
Viejo 13/02/16, 15:04:49
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Uff... inundar la red de pings ¿Seguro que lo necesitas? :S

La pena es que la biblioteca NIO de Java no permite enviar ICMPs de forma asíncrona, que entonces los enviabas todos con el mismo hilo y leías las contestaciones con otro.

El isReachable encima es que primero manda el ping (ICMP) y si no contesta intenta abrir una conexión TCP... más coste todavía. Y para más inri el método bloquea, por lo que el pool de hilos es inevitable. Y en ese caso sí que es mejor tener muchos hilos porque realmente van a estar detenidos la mayor parte del tiempo esperando que les llegue algo.

Si quieres comentar un poco más cuál es el objetivo igual damos con una forma más sencilla.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #9  
Viejo 13/02/16, 15:58:06
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

He bajado el timeOut a 250ms y he reducido los hilos a 32 para que no me bloquee la UI y la verdad me sigue funcionando bien y ya con mucho menos coste de tiempo y sin bloqueos.

Otra opción ya era complicarme e instalar nmap para android que funciona muy bien

gracias por todo
__________________
Responder Con Cita
  #10  
Viejo 13/02/16, 17:45:59
Array

[xs_avatar]
Dexafree Dexafree no está en línea
Mr. FAQMan
· Votos compra/venta: (1)
 
Fecha de registro: dic 2008
Mensajes: 8,021
Modelo de smartphone: Samsung Galaxy S i9000 + Galaxy Tab 10.1 WiFi
Tu operador: Movistar
Te dejo esta libreria por si te sirve:

https://github.com/stealthcopter/AndroidNetworkTools

Responder Con Cita
Los siguientes 2 usuarios han agradecido a Dexafree su comentario:
  #11  
Viejo 13/02/16, 18:19:30
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

He estado mirando el código fuente de la biblioteca esa por curiosidad:
- los pings los hace llamando a la herramienta ping del sistema si está disponible y parseando la salida (muy feo), o, alternativamente con el isReachable (normal, realmente no hay otra manera con el API de Android)
- el escaneo de puertos "asíncrono" abre un new Thread cada vez. Eso también es muy feo, es mejor tener un Executor para controlar cuántos hilos se crean y no tener que andar creando y destruyendo todo el rato. Y mejor todavía sería usar Java NIO y los SocketChannel que lo haces con un único hilo porque son llamadas no bloqueantes (lo que me recuerda que Netty ya es compatible con Android y está pensado para hacer clientes y servidores con Java NIO olvidándose de su complejidad)
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!

Última edición por mocelet Día 13/02/16 a las 18:34:35.
Responder Con Cita
Gracias de parte de:
  #12  
Viejo 13/02/16, 18:35:42
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

Muchas gracias a los 2, se agradece vuestra ayuda desinteresada
__________________
Responder Con Cita
  #13  
Viejo 13/02/16, 18:56:10
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

 Cita: Originalmente Escrito por mocelet Ver Mensaje
He estado mirando el código fuente de la biblioteca esa por curiosidad:
- los pings los hace llamando a la herramienta ping del sistema si está disponible y parseando la salida (muy feo), o, alternativamente con el isReachable (normal, realmente no hay otra manera con el API de Android)
- el escaneo de puertos "asíncrono" abre un new Thread cada vez. Eso también es muy feo, es mejor tener un Executor para controlar cuántos hilos se crean y no tener que andar creando y destruyendo todo el rato. Y mejor todavía sería usar Java NIO y los SocketChannel que lo haces con un único hilo porque son llamadas no bloqueantes (lo que me recuerda que Netty ya es compatible con Android y está pensado para hacer clientes y servidores con Java NIO olvidándose de su complejidad)

Una duda, exactamente que es java NIO, ya por curiosidad saber más sobre clases java que desconozco.
__________________
Responder Con Cita
  #14  
Viejo 13/02/16, 19:24:32
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Java NIO es un API de comunicaciones que entre otras cosas permite sockets no bloqueantes, evitando tener que estar abriendo hilos cada vez que se conecte alguien o quieras enviar algo.

Las comunicaciones no bloqueantes o asíncronas (asíncronas de verdad, que tengas un hilo esperando para devolverte un resultado no cuenta) son la base de cualquier servidor moderno que pretenda manejar cientos de miles de conexiones concurrentes (Netty por ejemplo que usa Java NIO, o node.js que aunque es javascript se basa en el mismo concepto y es un único hilo de ejecución).

Al ser un API de más bajo nivel es más complicado de usar (y aun así mejor usar una biblioteca que facilite la vida como Netty), y en el lado cliente tampoco tiene mucho sentido porque normalmente es para conectarte a un sitio nada más y que tengas un hilo dedicado no impacta demasiado. Pero para algo que se tiene que conectar (o intentar conectar) con 500 máquinas a la vez sí que sería un escenario donde mostraría su utilidad porque no haría falta más de un único hilo.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 09:10:37 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /