Foro de elhacker.net

Programación => Java => Mensaje iniciado por: omar_cdg en 28 Agosto 2015, 22:15 pm



Título: threads , duda
Publicado por: omar_cdg en 28 Agosto 2015, 22:15 pm
Hola amigos,  tengo una pequeña duda... a ver si alguien me puede ayudar.
Si tengo un programa que consta de dos clases.  Una es la GUI y otra la clase funcional a esa gui,  digamos. Que a su vez tiene una clase interna.
. Cómo tendria que hacer para colocar cada una de ellas en un hilo diferente.


Título: Re: threads , duda
Publicado por: El Benjo en 29 Agosto 2015, 06:55 am
Lo que se ejecuta en hilos distintos no son las clases, son las funciones de esas clases. Es decir que todo el tiempo tu aplicación ejecutará las funciones de cualquier clase en un hilo principal que es con el que comienzas. Cuando creas un nuevo hilo lo haces apuntando el hilo a una función y después ejecutas éste.

Quizá estés un poco confundido sobre la programación multihebra y su verdadero uso. Así que te recomiendo dar un repaso al concepto de programación multihebra primero.

También, dinos qué necesitas ejecutar en otro hilo y por qué necesitas ejecutarlo en otro hilo. Esto último es necesario siempre que programamos aplicaciones multihebra.


Título: Re: threads , duda
Publicado por: omar_cdg en 1 Septiembre 2015, 05:15 am
Hola, gracias por responder. Tengo algunas aplicaciones que las he creado de la siguiente manera:
una clase para lo que es la interface grafica del programa y otra para la parte funcional del mismo.
 Por ejemplo una de mis aplicaciones es un programa que muestra tarjetas de juegos de azar(prode loto quini etc, segun se elija). Pues bien la clase principal de, por ejemplo, prode es la gui donde solo armo la tarjeta
en otra clase hago toda la parte funcional (resultado de partidos, dobles).
He leido en mis libros sobre los threads y he entendido que mejoran mucho el rendimiento de un programa, ya que se ejecutan independientemente. Pues entonces queria saber como puedo yo aplicar esos hilos en mis apps. Y sí, estoy confundido al respecto. Gracias


Título: Re: threads , duda
Publicado por: El Benjo en 1 Septiembre 2015, 06:41 am
En efecto, lo que dice tu libro acerca de los hilos o threads es cierto, estos potencian mucho las aplicaciones, especialmente en procesadores multinucleo. Pero, los hilos unicamente son útiles en dos escenarios (creo, que alguien más me corrija si me equivoco) cuando tenemos un procesador con más de un núcleo y nuestro algoritmo puede hacer uso de todos los núcleos a la vez; y cuando debemos ejecutar una tarea en segundo plano por un tiempo prolongado y al mismo tiempo debemos ejecutar otras tareas por otro tiempo indefinido (tal es el caso de la GUI).

Los hilos funcionan de la siguiente manera:

-->Tienes un hilo principal
-->Creas un nuevo hilo con la dirección del código que ejecutará tu nuevo hilo (es decir, el método o función)
-->Lanzas el nuevo hilo.

A partir de este punto tu aplicación ya está corriendo dos hilos simultaneamente, es decir que ambas piezas de código se están ejecutando y tu segundo hilo terminará cuando llegue al final de tu función. Los hilos por lo general se usan, como te he dicho cuando tienes un código que demora mucho en ejecutarse y aún quieras que el usuario pueda emitir comando a la aplicación (un ejemplo de esto sería terminar la operación, como cuando presionas el botón de cancelar).

Debes tener en cuenta que los hilos no tienen un valor de retorno en el sentido tradicional de la palabra, pues al momento de que tú lanzar el hilo el flujo normal de tu programa seguirá sin esperar a que termina la función que estás ejecutando en el otro hilo que acabas de lanzar.

Te dejo el siguiente video que subí hace tiempo acerca de creación de hilos en C# y otro video de un caso práctico de uso en una aplicación:

https://youtu.be/GgyVTzXH804 (https://youtu.be/GgyVTzXH804)
https://youtu.be/vsd4SkAA8e4 (https://youtu.be/vsd4SkAA8e4)

Y uno más de multithreading en java

https://www.youtube.com/watch?v=ZxzCI3PAZwo (https://www.youtube.com/watch?v=ZxzCI3PAZwo)

Por desgracia no encontré ningún video sobre los conceptos de la programación multihebra. Espero hacer uno pronto y subirlo.


Título: Re: threads , duda
Publicado por: omar_cdg en 1 Septiembre 2015, 18:37 pm
Muchas gracias por tu tiempo y material, será apreciado. Saludos


Título: Re: threads , duda
Publicado por: Ur1cchio en 7 Septiembre 2015, 04:06 am
Voy a corregir algo, tenia entendido que los threads no aprovechan el multiprocesamiento, no es posible hacer que dos hilos o mas, pertenecientes a un mismo proceso corran en núcleos o procesadores diferentes, es mas, los hilos para el sistema operativo son transparentes, y el único que se encarga de planificarlos es el mismo proceso en el cual están ejecutando. El uso de threads no mejoran la performance de la aplicación, y a veces suelen causar problemas

Saludos


Título: Re: threads , duda
Publicado por: El Benjo en 7 Septiembre 2015, 06:57 am
Lo que mencionas es falso, una aplicación puede ejecutar dos hilos (pertenecientes al mismo proceso) en núcleos diferentes. E incluso puedes hacer las pruebas ejecutando un bucle que realice un trabajo intensivo; si tu PC tiene dos núcleos y ejecutas la función en un sólo hilo obtendrás una carga del procesador del 50% en el administrador de tareas y si ejecutas esa misma función en dos o más hilos obtendrás una carga del 100%.

Quizá lo que quisiste decir es que un mismo hilo sólo puede ejecutarse en un núcleo.


Título: Re: threads , duda
Publicado por: Ur1cchio en 7 Septiembre 2015, 15:32 pm
La verdad si te digo te miento, yo solo opino lo que estoy aprendiendo este cuatrimestre en la Universidad... Probablemente este entendiendo mal, o me este expresando mal. Pero aun asi, el único ente que se encarga de planificar en que momento que proceso va a usar un núcleo o procesador como quieran llamarlo es el sistema operativo. Es posible que un proceso en un cierto tiempo este " usando " dos núcleos aun así los hilos de un proceso comparten los mismos recursos y el mismo mapa de direcciones. A no ser que sean super independientes es muy poco probable que corran realmente en paralelo( solo es una suposición en base al conocimiento que tengo ).

Insisto, no lo se realmente. Y no estoy discutiendo, si alguien puede aportar con alguna bibliográfia seria genial.

Saludos!


Título: Re: threads , duda
Publicado por: El Benjo en 7 Septiembre 2015, 20:53 pm
Bueno, te voy a plantear la prueba que hice una vez y los resultados que obtuve y de ahí deduces lo que quieras.

Creé una función dentro de mi aplicación que hacía 1,000 millones de sumas.
Primero lancé esa función en mi hilo principal y obtuve 2.4 segundos en tiempo de ejecución.
Después lancé esa función en un segundo hilo y la ejecuté al mismo tiempo dentro de mi hilo principal (o sea el doble de operaciones de suma) y el resultado en tiempo de ejecución fue de 2.7 segundos.

Como vez, el tiempo es casi el mismo usando dos hilos (pues mi procesador tiene dos núcleos) la diferencia es que hice el doble de operaciones por segundo.

Lo que mencionas sobre los recursos y el hecho de que el sistema operativo sea el que asigna un tiempo a cada hilo es irrelevante, pues al haber más de un núcleo siempre va estar un hilo en cada uno de los núcleos.

Ponte a pensar que si lo que dijeras es cierto, el haber inventado los procesadores con más de un núcleo no serviría de nada. Saludos y espero que los números hayan hablado. De todas formas si no me crees, has la prueba por ti mismo.

EDITADO:

https://es.wikipedia.org/wiki/Hilo_de_ejecuci%C3%B3n (https://es.wikipedia.org/wiki/Hilo_de_ejecuci%C3%B3n)

En el enlace anterior ve a donde dice "Hilos a nivel de núcleo (KLT)"

Aquí también, al inicio, puedes leer acerca de como funciona el cambio de hilos y lo que mencionabas sobre los recursos, y de hecho, te dicen que esto es una ventaja.

"En muchos de los sistemas operativos que dan facilidades a los hilos, es más rápido cambiar de un hilo a otro dentro del mismo proceso, que cambiar de un proceso a otro. Este fenómeno se debe a que los hilos comparten datos y espacios de direcciones, mientras que los procesos, al ser independientes, no lo hacen."


Título: Re: threads , duda
Publicado por: omar_cdg en 9 Septiembre 2015, 02:47 am
Hola, tengo entendido que cada hilo corre en un nucleo diferente, es por eso que los procesadores modernos pueden correr los programas  de manera mas rapida eficiente si las apps cuentan con varios threads


Título: Re: threads , duda
Publicado por: El Benjo en 10 Septiembre 2015, 05:44 am
Así es, parcialmente la idea es esa, pero en la realidad no hay suficientes núcleos para cubrir cada hilo de cada proceso por lo que estos se alternan, pero sí la idea es esa. Lo que es más en el sistema operativo windows hay una parte del registro que te dice cuántos núcleos posee tu procesador y de esta forma puedas lanzar un número dinámico de threads dependiendo de la situación.

Otra cosa a tener en cuenta es que los procesadores de intel con hyper-threading poseen la habilidad de manejar dos hilos por núcleo. Es decir que uno de estos procesadores con 4 núcleos tiene la capacidad de ejecutar 8 hilos simultaneamente casi con el mismo rendimiento que un procesador de 8 núcleos físicos.


Título: Re: threads , duda
Publicado por: Ur1cchio en 10 Septiembre 2015, 17:45 pm
Al final estaba equivocado mil disculpas, los hilos que no tienen la capacidad de aprovechar multiprocesamiento son los ULT...
Gracias