miércoles, 20 de mayo de 2009

Hilos en Java

A veces necesitamos que nuestro programa Java realice varias cosas simultáneamente. Otras veces tiene que realizar una tarea muy pesada, por ejemplo, consultar en el listín telefónico todos los nombres de chica que tengan la letra n, que tarda mucho y no deseamos que todo se quede parado mientras se realiza dicha tarea. Para conseguir que Java haga varias cosas a la vez o que el programa no se quede parado mientras realiza una tarea compleja, tenemos los hilos (Threads).

Prioridades de hilo

El intérprete de Java utiliza prioridades para determinar cómo debe comportarse cada hilo con respecto a los demás. Las prioridades de hilo son valores entre 1 y 10 que indican la prioridad relativa de un hilo con respecto a los demás.

Thread

Encapsula todo el control necesario sobre los hilos, En el objeto Thread hay métodos que controlan si el hilo se está ejecutando, está durmiendo, en suspenso o detenido. La clase Thread es la única manera de controlar el comportamiento de los hilos. En la siguiente instrucción se muestra como acceder al hilo en ejecución actual:

Thread t = Thread.currentThread(); * el hilo actual se almacena en la variable t *

Runnable

Runnable es una interfaz simple que abstrae la noción de que se desea que algún código se "ejecute" asíncronamente. Para implementar Runnable, a una clase le basta con implementar un solo método llamado run.

Resumen de la interfaz de programación (API) de hilos

Se incluye a continuación una referencia rápida a todos los métodos de la clase Thread que se han comentado en este capítulo.

Métodos de clase

Estos son los métodos estáticos que deben llamarse de manera directa en la clase Thread.

  • currentThread: el método estático devuelve el objeto Thread que representa al hilo que se ejecuta actualmente.
  • yield: este método hace que el intérprete cambie de contexto entre el hilo actual y el siguiente hilo ejecutable disponible. Es una manera de asegurar que los hilos de menor prioridad no sufran inanición.
  • Sleep(int n): el método sleep provoca que el intérprete ponga al hilo en curso a dormir durante n milisegundos. Una vez transcurridos los n milisegundos, dicho hilo volverá a estar disponible para su ejecución. Los relojes asociados a la mayor parte de los intérpretes Java nos serán capaces de obtener precisiones mayores de 10 milisegundos.

Métodos de instancia

  • start: indica al intérprete de Java que cree un contexto de hilo del sistema y comience a ejecutarlo. A continuación, el método run objeto de este hilo será llamado en el nuevo contexto del hilo. Debe tomarse la precaución de no llamar al método start más de una vez sobre un objeto hilo dado.
  • run: constituye el cuerpo de un hilo en ejecución. Este es el único método de la interfaz Runnable. Es llamado por el método start después de que el hilo apropiado del sistema se haya inicializado. Siempre que el método run devuelva el control, el hilo actual se detendrá.
  • stop: provoca que el hilo se detenga de manera inmediata. A menudo constituye una manera brusca de detener un hilo, especialmente si este método se ejecuta sobre el hilo en curso. En tal caso, la línea inmediatamente posterior a la llamada al método stop no llega a ejecutarse jamás, pues el contexto del hilo muere antes de que stop devuelva el control.
  • suspend: es distinto de stop. suspend toma el hilo y provoca que se detenga su ejecución sin destruir el hilo de sistema subyacente, ni el estado del hilo anteriormente en ejecución. Si la ejecución de un hilo se suspende, puede llamarse a resume sobre el mismo hilo para lograr que vuelva a ejecutarse de nuevo.
  • resume: se utiliza para revivir un hilo suspendido.
  • setPriority(int p): asigna al hilo la prioridad indicada por el valor entero pasado como parámetro.
  • getPriority: devuelve la prioridad del hilo en curso, que es un valor entre 1 y 10.
  • setName(String nombre): identifica al hilo con un nombre mnemónico. De esta manera se facilita la depuración de programas multihilo.
  • getName: devuelve el valor actual, de tipo cadena, asignado como nombre al hilo mediante setName.

jueves, 16 de abril de 2009

jueves, 2 de abril de 2009

RESEÑA HISTORICA

El concepto fundamental de la programacion concurrente es la nocion de proceso. El termino proceso fue utilizado por primera vez por los diseñadores del sistema Multics en los años 60’s. Desde entonces, el termino proceso, utilizado a veces como sinonimo de tarea, ha tenido muchas definiciones. A continuacion se presentan algunas:

Un programa en ejecucion.

  • Una actividad asincrona
  • El “espiritu animado” de un procedimiento
  • El “centro de control” de un procedimiento en ejecucion
  • Lo que se manifiesta por la existencia de un “bloque de control del proceso” en el sistema operativo
  • La entidad a la que se asignan los procesadores
  • La unidad “despachable”

Aunque se han dado muchas otras definiciones, no hay una definicion universalmente aceptada, pero el concepto de “Programa en ejecucion” parece ser el que se utiliza con mas frecuencia. Un programa es una entidad inanimada; solo cuando un procesador le “infunde vida” se convierte en la entidad “activa” que se denomina proceso.

Un proceso pasa por una serie de datos discretos. Se dice que un proceso se esta ejecutando (estado de ejecucion), si tiene asignada la CPU. Se dice que un proceso esta listo(estado listo) si pudiera utilizar la CPU en caso de haber una disponible. Un proceso esta bloqueado (estado bloqueado) si se esta esperando que suceda algun evento antes de poder seguir la ejecucion.

FUNDAMENTOS

como sabemos un algoritmo es una lista bien definida, ordenada y finita de operaciones que permite hallar la solución a un problema. Dado un estado inicial y una entrada, a través de pasos sucesivos y bien definidos se llega a un estado final, obteniendo una solución, esta solucion nos ayuda a mejorar los problemas de concurrencia. acontinuacion podemos ver en la aplicacion de los robots:

jueves, 19 de marzo de 2009

SEGUNDA SOCIALIZACION

SÍNTESIS EN VIDEO DE LA PROGRAMACION CONCURRENTE

Este es un ejemplo de programacion concurrente en la I.A aplicada en la plataforma robótica para probar algoritmos que resuelven problemas reales de concurrencia.

Su funcionamiento nos ha llevado a la coordinación de robots, diseño de protocolos de comunicación, sistemas empotrados o sistemas en tiempo real, entre otros, utilizando lenguajes de programacion como: C, PASCAL entre otros.

Lenguaje scheme se podría decir que es como un tipo de programacion concurrente ya que para conseguir un resultado necesitamos realizar ciertos procesos unos tras de otros para conseguir un resultado.

miércoles, 4 de marzo de 2009

Introducción:

Este tipo de programación se utiliza cuando tenemos que realizar varias acciones a la vez. Se suele utilizar para controlar los accesos de usuarios y programas a un recurso de forma simultanea. Se trata de una programación más lenta y laboriosa, obteniendo unos resultados lentos en las acciones. La programación concurrente está relacionada con la programación paralela, pero enfatiza más la interacción entre tareas. Así, la correcta secuencia de interacciones o comunicaciones entre los procesos y el acceso coordinado de recursos que se comparten por todos los procesos o tareas son las claves de esta disciplina. Los pioneros en este campo fueron Edsger Dijkstra, Per Brinch Hansen, y C. A. R. Hoare.

Se conoce por programación concurrente a la rama de la informática que trata de las notaciones y técnicas de programación que se usan para expresar el paralelismo potencial entre tareas y para resolver los problemas de comunicación y sincronización entre procesos. En la programación concurrente se supone que hay un procesador utilizable por cada tarea; no se hace ninguna suposición de si el procesador será una unidad independiente para cada uno de ellos o si será una sola CPU que se comparte en el tiempo entre las tareas. Independientemente de cómo se vaya a ejecutar realmente el programa, en un sistema uniprocesador o multiprocesador, el resultado debe ser el correcto. Por ello, se supone que existe un conjunto de instrucciones primitivas que son o bien parte del S.O. o bien parte de un lenguaje de programación, y cuya correcta implementación y corrección está garantizada por el sistema.