Hilos en Java: Creación y Gestión de Procesos Ligeros


Qué es un Thread

La Máquina Virtual Java (JVM) es un sistema multi-thread. Es decir, es capaz de ejecutar varias secuencias de ejecución (programas) simultáneamente. La JVM gestiona todos los detalles, asignación de tiempos de ejecución, prioridades, etc, de forma similar a como gestiona un Sistema Operativo múltiples procesos. La diferencia básica entre un proceso de Sistema Operativo y un Thread Java es que los Threads corren dentro de la JVM, que es un proceso del Sistema Operativo y por tanto comparten todos los recursos, incluida la memoria y las variables y objetos allí definidos. A este tipo de procesos donde se comparte los recursos se les llama a veces ‘procesos ligeros’ (lightweight process).

Java da soporte al concepto de Thread desde el mismo lenguaje, con algunas clases e interfaces definidas en el package java.lang y con métodos específicos para la manipulación de Threads en la clase Object. 

Desde el punto de vista de las aplicaciones los threads son útiles porque permiten que el flujo del programa sea divido en dos o más partes, cada una ocupándose de alguna tarea. Por ejemplo un Thread puede encargarse de la comunicación con el usuario, mientras otros actuan en segundo plano, realizando la transmisión de un fichero, accediendo a recursos del sistema (cargar sonidos, leer ficheros …), etc. De hecho todos los programas con interface gráfico (AWT o Swing) son multithread porque los eventos y las rutinas de dibujado de las ventanas corren en un thread distinto al principal.

La Clase Thread

La forma más directa para hacer un programa multi-thread es extender la clase Thread, y redefinir el método run(). Este método es invocado cuando se inicia el thread (mediante una llamada al método start() de la clase thread). El thread se inicia con la llamada al método run y termina cuando termina éste. El ejemplo ilustra estas ideas:

public class ThreadEjemplo extends Thread {
    public ThreadEjemplo(String str) {
        super(str);    }
    public void run() {
        for (int i = 0; i
            System.out.println(i +"" + getName());
        System.out.println"Termina thread" + getName());    }
    public static void main (String [] args) {
        new ThreadEjemplo"Pep").start();
        new ThreadEjemplo"Jua").start();
        System.out.println"Termina thread mai");   }}

Compilar y ejecutar el programa.

Ejecutar varias veces el programa no siempre se ejecuta igual. 

Notas sobre el programa:

  • La clase Thread está en el package java.lang. Por tanto no es necesario el import.
  • El constructor public Thread(String str) recibie un parámetro que es la identificación del Thread.
  • El método run contiene el bloque de ejecución del Thread. Dentro de él, el método getName() devuelve el nombre del Thread (el que se ha pasado como argumento al constructor).
  • El método main crea dos objetos de clase ThreadEjemplo y los inicia con la llamada al método start(). (el cual inicia el nuevo thread y llama al método run() ).
  • Observa en la salida el primer mensaje, de finalización del thread main. La ejecución de los threads es asíncrona. Realiza la llamada al método start(), éste le devuelve control y continua su ejecución, independiente de los otros threads.
  • En la salida los mensajes de un thread y otro se van mezclando. La máquina virtual asigna tiempos a cada thread. 

La Interface Runnable

La interface Runnable proporciona un método alternativo a la utilización de la clase Thread, para los casos en los que no es posible hacer que nuestra clase extienda la clase Thread. Esto ocurre cuando nuestra clase, que deseamos correr en un thread independiente deba extender alguna otra clase. Dado que no existe herencia múltiple, nuestra clase no puede extender a la vez la clase Thread y otra más. En este caso nuestra clase debe implantar la interface Runnable, variando ligeramente la forma en que se crean e inician los nuevos threads. 

El siguiente ejemplo es equivalente al del apartado anterior, pero utilizando la interface Runnable:

public class ThreadEjemplo implements Runnable {
    public void run() {
        for (int i = 0; i
            System.out.println(i + » » + Thread.currentThread().getName());
        System.out.println(«Termina thread » + Thread.currentThread().getName());
    }
    public static void main (String [] args) {
        new Thread ( new ThreadEjemplo() , «Pepe»).start();
        new Thread ( new ThreadEjemplo() , «Juan»).start();
        System.out.println(«Termina thread main»);
    }
}

Observese en este caso:

  • Se implanta la interface Runnable en lugar de extender la clase Thread.
  • El constructor que había antes no es necesario.
  • En el main observa la forma en que se crea el thread. Esa expresión es equivalente a:

ThreadEjemplo ejemplo = new ThreadEjemplo();
Thread thread = new Thread ( ejemplo , «Pepe») ;
thread.start();

    • Primero se crea la instancia de nuestra clase.
    • Después se crea una instancia de la clase Thread, pasando como parámetros la referencia de nuestro objeto y el nombre del nuevo thread.
    • Por último se llama al método start de la clase thread. Este método iniciará el nuevo thread y llamará al método run() de nuestra clase.
  • Por útlimo, obsérvese la llamada al método getName() desde run(). getName es un método de la clase Thread, por lo que nuestra clase debe obtener una referencia al thread propio. Es lo que hace el método estático currentThread() de la clase Thread.

Ciclo de Vida de un Thread

lADLxAC6sgB26QAxYwB67wxQdN0rPxDsQwC1NYCG


La Interface Runnable

La interface Runnable proporciona un método alternativo a la utilización de la clase Thread, para los casos en los que no es posible hacer que nuestra clase extienda la clase Thread. Esto ocurre cuando nuestra clase, que deseamos correr en un thread independiente deba extender alguna otra clase. Dado que no existe herencia múltiple, nuestra clase no puede extender a la vez la clase Thread y otra más. En este caso nuestra clase debe implantar la interface Runnable, variando ligeramente la forma en que se crean e inician los nuevos threads. El siguiente ejemplo es equivalente al del apartado anterior, pero utilizando la interface Runnable:

public class ThreadEjemplo implements Runnable {
    public void run() {
        for (int i = 0; i
            System.out.println(i + » » + Thread.currentThread().getName());
        System.out.println(«Termina thread » + Thread.currentThread().getName());    }
    public static void main (String [] args) {
        new Thread ( new ThreadEjemplo() , «Pepe»).start();
        new Thread ( new ThreadEjemplo() , «Juan»).start();
        System.out.println(«Termina thread main»);    }}

Observese en este caso:

  • Se implanta la interface Runnable en lugar de extender la clase Thread.
  • El constructor que había antes no es necesario.
  • En el main observa la forma en que se crea el thread. Esa expresión es equivalente a:

ThreadEjemplo ejemplo = new ThreadEjemplo();
Thread thread = new Thread ( ejemplo , «Pepe») ;
thread.start();

    • Primero se crea la instancia de nuestra clase.
    • Después se crea una instancia de la clase Thread, pasando como parámetros la referencia de nuestro objeto y el nombre del nuevo thread.
    • Por último se llama al método start de la clase thread. Este método iniciará el nuevo thread y llamará al método run() de nuestra clase.
  • Por útlimo, obsérvese la llamada al método getName() desde run(). getName es un método de la clase Thread, por lo que nuestra clase debe obtener una referencia al thread propio. Es lo que hace el método estático currentThread() de la clase Thread. Ciclo de Vida de un ThreadlADLxAC6sgB26QAxYwB67wxQdN0rPxDsQwC1NYCG


CONTRATO DE ARRENDAMIENTO.

Conste por el presente documento privado el CONTRATO DE ARRENDAMIENTO que celebran de una parte ……………………….., a quien en adelante se le denominará EL ARRENDADOR identificado con DNI Nº …………. con domicilio en Av. Javier Prado Este Nº 6521 Distrito La Molina, y de la otra parte …………….. a quien en adelante se le denominará EL ARRENDATARIO, con RUC Nº  ……………….., con domicilio  en ….…………………., representada por su Gerente General doña ………………….. identificada con DNI Nº ……………, en los términos y condiciones siguientes:

PRIMERO: EL ARRENDADOR  es propietario del inmueble sito en la Av. Javier Prado ………… Distrito La Molina – Lima.

SEGUNDO: Por el presente EL ARRENDADOR  da en arrendamiento a EL ARRENDATARIO  el inmueble descrito en al cláusula primera

TERCERO: La renta mensual queda pactada en la suma de USA $ 1,600.00 (UN MIL Y OO/100 DÓLARES AMERICANOS) mas impuestos ( el impuesto mensual a que se refiere es el de 1era categoría que es el 6.25% del monto del alquiler el obligado a pagar es el arrendador  ), debiendo EL ARRENDADOR  emitir el recibo de pago  correspondiente.

La renta mensual se paga por adelantado  en el domicilio de EL ARRENDADOR  indicado en el introito del presente.

CUARTO: El arrendamiento es por el plazo de un (01) año, plazo que comienza a regir desde el ………… de 2010 al ………….. de 2011 debiendo EL ARRENDATARIO devolver el inmueble al vencimiento del presente contrato, sin intimación o formalidad alguna

QUINTA: Queda convenido que si al vencimiento del presente contrato EL ARRENDATARIO no desocupara y entregara a EL ARRENDADOR el local materia de este contrato, EL ARRENDATARIO pagará EL ARRENDADOR  la suma de USA$60.00 (SESENTA Y 00/100 DÓLARES NORTEAMERICANOS) diarios, por cada dia de ocupación hasta que se produzca la desocupación y entrega efectiva a EL ARRENDADOR, sin que ello signifique renovación o prorroga del presente contrato reservándose EL ARRENDADOR  el derecho de iniciar la acción judicial correspondiente.

SEXTA: EL ARRENDATARIO, declara que conoce el local que toma en arrendamiento y lo recibe a su entera satisfacción y en el estado en que se encuentra, recibiendo las llaves de la misma a la firma de la presente minuta..

SÉPTIMA: EL ARRENDATARIO se obliga a destinar el local única y exclusivamente para comercio u oficinas administrativas, quedando prohibido el uso del local como casa – habitación de uso parcial o temporal, la infracción de esta obligación será causa de resolución del presente contrato.

OCTAVA Está terminantemente prohibido el subarriendo, el traspaso o la cesión, sea parcial o total del local.

NOVENA.- EL ARRENDATARIO, se obliga a cumplir diligentemente con todas y cada una de las obligaciones contenidas en el  Art. 1681 y siguientes del Código Civil y adicionalmente a:

  1. Permitir a EL ARRENDADOR inspeccionar el inmueble   arrendado para cerciorarse del uso adecuado a que se obliga, previo aviso con 72 horas de anticipación.
    1. Encargarse por su cuenta y costo, de la reparación del inmueble y/o instalaciones que se deterioren o malogren como consecuencia del uso de los mismos, así como  encargarse del mantenimiento adecuado del bien.
    2. El Arrendatario no podrá hacer cambios o modificaciones en el actual estado del inmueble, sin el conocimiento y autorización escrita de parte de EL ARRENDADOR.

Dichos  cambios o modificaciones y en general cualquier mejora que se introduzca en el inmueble arrendado, quedarán en favor  de El Arrendador sin obligación de pago o reembolso alguno por tales


cambios, modificaciones o mejoras.

  1. Al término del contrato, El ARRENDATARIO entregará personalmente las llaves que al suscribir este contrato reciben.

DECIMA.- Serán de cargo de EL ARRENDATARIO el pago puntual de los arbitrios municipales y servicio de serenazgo, los consumos de agua, energía eléctrica.

La copia de los recibos debidamente cancelados por los conceptos antes indicados, deberán ser entregados mensualmente a EL ARRENDADOR

Será de cargo de EL ARRENDADOR el pago puntual de la cuota de mantenimiento del edificio donde se encuentra el inmueble.

DECIMA PRIMERA.- Ambas partes acuerdan que el presente contrato quedará de pleno derecho y automáticamente resuelto, en los siguientes casos:

11.1    Si EL ARRENDATARIO da uso distinto al inmueble, o se practican en el inmueble actos contrarios al orden público, buenas costumbres o que molesten al vecindario. 11.2     Si se subarrienda, traspasa o cede, total o parcialmente, la posesión del inmueble a terceros. 11.3             La falta de pago de la renta convenida correspondiente a dos (2) meses y quince días. 11.4Si el Arrendatario incumple cualquiera de las obligaciones asumidas que en el  presente contrato.

EL ARRENDADOR deberá comunicar la resolución a EL ARRENDATARIO mediante misiva notarial dirigida al domicilio que indica en el introito del presente. De producirse la resolución del contrato EL ARRENDATARIO quedara obligado a devolver el inmueble en un plazo no mayor de 5 días calendarios, contados desde la fecha en que el Notario deje la prenotada carta a EL ARRENDATARIO en su domicilio indicado en el introito del presente. En caso EL ARRENDATARIO no efectúe la devolución en el plazo prenotado,  EL ARRENDATARIO se obliga a pagar a EL ARRENDADOR por cada día de atraso en la devolución del inmueble arrendado, al pago de la penalidad estipulada en la cláusula Sexta del presente contrato.

DECIMA SEGUNDA.- A la suscripción del presente contrato EL ARRENDATARIO hace entrega en calidad de deposito de garantía a EL ARRENDADOR, la suma de US$ 2,000.00 (DOS MIL Y 00/100 DÓLARES AMERICANOS) para garantizar y respaldar el cumplimiento de todas y cada una de las obligaciones contraídas en el presente documento.

Dicho importe no devengará intereses o renta adicional y solo será devuelto en caso al finalizar el presente contrato EL ARRENDATARIO no adeude ningún concepto derivado de las obligaciones estipuladas en el presente, debiendo reputarse la garantía al pago de las obligaciones, de existir deuda, de acuerdo al siguiente orden: pago de servicios (agua, luz, mantenimiento de edificio), pago de refracciones en el departamento, penalidades y finalmente a rentas impagas. En caso exista deuda, el arrendatario autoriza a EL ARRENDADOR a cobrarse de la garantía entregada en el orden señalado, en caso de saldo deudor el arrendador tiene expedito su derecho para hacer uso de las acciones legales que al ley le franquea.

DECIMA QUINTA.- Las partes, se someten expresamente a las Leyes Peruanas y a la Jurisdicción de los tribunales de la ciudad de Lima, Perú, para todas las cuestiones que pudieran derivarse del presente contrato y señalan como sus domicilios los consignados en la introducción del presente documento, no surtiendo efecto la variación de domicilio que pueda producirse si no es notificada por carta notarial  a la otra parte, con diez días de anticipación y siempre que el cambio se fije dentro del perímetro del radio urbano de la ciudad de Lima.

En señal de conformidad de todas y cada una de las cláusulas que contiene el presente contrato, las partes lo suscriben en dos (2) originales, en Lima a los 13 días el mes de Diciembre de 2010. 

Dejar un Comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *