Hilos en Java

Share Embed Donate


Short Description

Download Hilos en Java...

Description

Hilos

Boris Estiven Palacios Alarcón

Barranquilla 2010

En la naturaleza se presentan innumerables ejemplos de procesos que se Realizan de manera parela, simultáneos o concurrentes. Por ejemplo, para el caso del lector, los procesos que está realizando todo su cuerpo integral, mientras realiza la acción consciente, de leer este párrafo. En el plano de los sistem sistemas as artifi artificia ciales les,, la concur concurrenc rencia ia es un denomi denominad nador or común, común, el computador, la internet, los juegos, en los sistemas sofisticados de los automóviles modernos, las actuales comunicaciones inalambricas, etc. Por tales razones, la concurrencia es un fenómeno importante de tratar, ya que permite permite el desarro desarrollo llo de sistem sistemas as capace capacess de adelan adelantar tar,, múltip múltiples les  procesos simultáneamente. A su vez cada proceso se puede componer de múltiples tareas, ejecutándose según ciertas reglas, de manera simultánea.

Hasta el momento se han desarrollado programas que realizan una sola tarea, entendiendose por tarea, un hilo de ejecución o un thread , tambien denominados de flujo único, en contraste con los programas que realizan más de una tarea, o de multitareas o multithreads, denominados de flujo múlti múltiple ple.. Especi Especific ficame amente nte una tarea tarea se encarga encarga de contro controlar lar un único único aspecto, dentro de la ejecución de un programa, por ejemplo el manejo de gráficos, las entradas/salidas de archivos en disco, u otros. Las tareas se diferencian de los procesos, en que las primeras comparten los mismos recursos del programa que las contiene, en tanto los procesos tienen en forma separada su código, así como sus datos. Se puede definir hilo como una secuencia única de control de flujo dentro de un programa. Entendiendo que puede haber más de una secuencia de contro controll o hilos. hilos. Java Java permit permitee realiz realizar ar program programaci ación ón multih multihilo ilo,, el cual cual consiste en programas que contienen dos o más partes que se ejecutan de manera concurrente. Una parte que se ejecuta independientemente de las demás se denomina un hilo (thread ). ).

En un entorno de multitarea basada en hilos, el hilo es la unidad de código más pequeña que se puede seleccionar para ejecución. La programación   basada en multihilos, permite escribir programas más eficientes ya que optimizan los recursos de la Unidad Central de Proceso (CPU), al reducir al mínimo los tiempos de inactividad. Este es un factor muy importante a tener en cuenta en el manejo de entornos interactivos, como es el caso del trabajo en la red, en dondelas velocidades de transmisión son mucho más lentas que los requeridos por laCPU en el procesamiento de esos datos, así como como tamb tambie ien n duran durante te el mane manejo jo del del sist sistem emaa de archi archivo vos, s, lect lectur uraa y grabación, que son más lentos que las velocidades de la CPU en su proceso. Las Las anim animac acio ione ness y los los jueg juegos os por por ejem ejempl plo, o, requi requiere eren n de una mayo mayor  r  optimización de los recursos de CPU. La programación multihilo permite acceder a los recursos de tiempo libre de la CPU, mientras se realizan otras tareas. Es otra de las razones de importancia para el estudio de sistemas basados en multihilos. El modelo multihilo está inmerso en el interprete de Java, ya que las  bibliotecas de clases estan diseñadas teniendo en mente este modelo. Los hilos forman parte de todos los programas en Java. Un hilo dentro de un   programa Java es un procedimiento que se puede ejecutar independiente del resto de una aplicación. La siguiente figura ilustra esquemáticamente un programa de un hilo y un  programa de dos hilos.

Ciclo de vida de un hilo Un hilo tiene un ciclo de vida que va desde su creación hsta su terminación. Durante su ciclo de vida cada uno de los hilos o tareas de una aplicación   pue puede de esta estarr en dife diferen rente tess esta estado dos, s, algun algunos os de los los cual cuales es se indi indica can n a continuación: • Nacido :

Cuando se acaba de crear un hilo, se dice que está nacido, y continúa continúa en ese estado hasta que se invoca el método start() del hilo. La siguiente sentencia crea un nuevo thread pero no lo arranca, por lo tanto deja el thread en el estado de nacido. Thread miHilo = new MiClaseThread(); Cuando un thread está en este estado, es sólo un objeto Thread vacío o nulo. No se han asignado asignado recursos del sistema todavía para el thread. Así, cuando un thread está en este estado, lo único que se puede hacer  es arrancarlo con start().

Listo: Cuando se invoca el método start() del hilo, se dice que está en estado listo. El método se arranca con la siguiente instrucción, para el caso del hilo miHilo: •

miHilo.start(); • Ejecutable :

cuando el método start() se ejecuta, crea los recursos del sistema necesarios para ejecutar el thread, programa el thread para

ejecutarse, y llama al método run() del thread que se ejecuta en forma orma secu secuen enci cial al.. En este este punt punto o el thre thread ad est está en el est estado ado ejecutable . Se denomina así puesto que todavía no ha empezado a ejecutarse. • En ejecución: Un hilo en estado de listo de la más alta prioridad, pasa al esta estado do de ejec ejecuc ució ión, n, cuan cuando do se le asig asigna nan n los los recu recurs rsos os de un  procesador, o sea cuando inicia su ejecución. Aquí el thread está en ejecución .Cada hilo tiene su prioridad, hilos con alta prioridad se ejecutan preferencialmente sobre los hilos de baja prioridad. • No ejecutable :Un hilo continúa la ejecución de su método run(), hasta que pasa al estado de no ejecutable originado cuando ocurre alguno de los siguientes cuatro eventos: Se invoca a su método sleep() . Se invoca a su su método suspend() . El threa thread d util utiliz izaa su méto método do wait()   para para espe espera rarr una una condi condici ción ón variable. El thread está bloqueado durante una solicitud de entrada/salida.

• Muerto :

Un hilo pasa al estado de muerto cuando se termina su método run(), o cuando se ha invocado su método stop(). En algún momento el sistema dispondrá entonces del hilo muerto. Un hilo puede morir  de dos formas:

.Muerte natural : se produce cuando su método run() sale normalmente. Por ejemplo, el bucle while en este método es un bucle que itera 100 veces y luego sale. Por tanto el hilo morirá naturalmente cuando se llegue al final de la iteración, es decir se termina su método run().  public void run() { int i = 0; while (i < 100) { i++; System.out.println("i = " + i); } }

Por muerte provocada: en cualquier momento llamando a su método stop(). El siguiente código crea y arranca miHilo luego lo pone a dormir durante 10 segundos. Cuando el thread actual se despierta, se lo mata con miHilo.stop(). El método stop() lanza un objeto ThreadDeath hacia al hilo a eliminar. El thread moririá cuando reciba realmente la excepción ThreadDeath. Thread miHilo = new MiClaseThread(); miHilo.start(); try { Thread.currentThread().sleep(10000); } catch (InterruptedException e){ }miHilo.stop();

El método stop()  provoca una terminación súbita del método run() del hilo. Si el método run() estuviera realizando cálculos sensibles, stop()   pod podrí ríaa deja dejarr el prog progra rama ma en un esta estado do inco incons nsis iste tent nte. e.  Normalmente, no se debería

MULTIHILO Y MULTIPROCESO Un hilo de ejecucion , en sistemas operativos, es una característica que permite a una aplicación realizar varias tareas a la vez (concurrentemente). Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de

autenticación, etc. Esta técnica permite simplificar el diseño de una aplicación que debe ll evar a cabo distintas funciones simultáneamente. Un hilo es básicamente una tarea que puede ser ejecutada en paralelo con otra tarea. Los hilos de ejecución que comparten los mismos recursos, sumados a estos recursos, son en conjunto conocidos como un proceso. El hecho de que los hilos de ejecución de un mismo  proceso compartan los recursos hace que cualquiera de estos hilos pueda modificar éstos. Cuando un hilo modifica un dato en la memoria, los otros hilos acceden a ese dato modificado inmediatamente. Lo que es propio de cada hilo es el contador de programa, la pila de ejecución y el estado de la CPU (incluyendo el valor de los registros). El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga activo. Cuando el proceso finaliza, todos sus hilos de ejecución también han terminado. Asimismo en el momento en el que todos los hilos de ejecución finalizan, el proceso no existe más y todos sus recursos son liberados.

Diferencia entre Hilo Y Multiproceso

Los hilos se distinguen de los tradicionales procesos en que los procesos son –generalmente– independientes, llevan bastante información de estados, e interactúan sólo a través de mecanismos de comunicación dados por el sistema. Por otra parte, muchos hilos generalmente comparten otros recursos de forma directa. 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. Al cambiar de un proceso a otro el sistema operativo (mediante el dispatcher ) genera lo que se conoce como overhead , que es tiempo desperdiciado por el procesador para realizar un cambio de contexto ( context switch), en este caso pasar del estado de ejecución (running ) al estado de espera ( waiting ) y colocar el nuevo proceso en ejecución. En los hilos, como pertenecen a un mismo proceso, al realizar un cambio de hilo el tiempo perdido es casi despreciable.

Ejercicio Realizado.  Ya la necesidad de usar hilos package cajatexto; import javax.swing.*;

import java.awt.*; import java.awt.event.*; public class cajatexto extends JFrame implements ActionListener { JButton b1,b2; TextArea ta; JPanel p,p2; public cajatexto() { b1=new JButton("parpadear"); b1.addActionListener(this); b2=new JButton("parar"); b2.addActionListener(this); ta=new TextArea(20,20); p=new JPanel(); p.setLayout(new BorderLayout()); p.setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); p.add("Center",ta); p2=new JPanel(); p2.setLayout(new GridLayout(1,2)); p2.add(b1); p2.add(b2); p.add("South",p2); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent we){ System.exit(0); } } ); setSize(400,400); setLocation(200,200); show(); setContentPane(p); } public void actionPerformed(ActionEvent ae){ if(ae.getSource()==b1){ for(int i=0;i
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF