Ir al contenido principal

Threads (Hilos) en Java 1.7 con MVC

Threads in Java 1.7 con MVC

El manejo de Threads (Hilos) ha ido cambiando con el paso de las versiones de java, dejando obsoletos varios de los métodos antes utilizados como Stop() que permitía parar la ejecución de un hilo.

En este tutorial se muestra la creación de hilos y su interrupción, permitiendo crear tantos como sean necesarios.


1.- Crear un nuevo proyecto en NetBeans, y crear la siguiente estructura de paquetes, donde ViewMain es un JFrame que contiene los controles de los hilos.



2.- Interfaz gráficas de la practica ViewMain.java



3.- Componentes de la interfaz gráfica



Nota: hay que recordar que los botones deben ser públicos para poder programar su comportamiento desde el controlador.

4.ModelMain.java

package model;

public class ModelMain {

    public ModelMain() {
    }
    
}

5.ModelHilo.java

El siguiente código es el ejemplo del hilo y contiene los siguientes elementos:

Extiende la clase Thread, lo que permite crear hilos independientes con el mismo comportamiento.

El método run() es donde se programa el comportamiento que tendrá el Hilo, en este caso tiene un cotandor que se va a ir incrementando y mostrando su valor.

El método Thread.sleep(1000);  permite que el hilo se “duerma” durante un segundo, antes de continuar su ejecución.

Cuando el hilo reciba la orden interrupt este atrapará la excepción InterruptedException con lo que se detendrá la ejecución del hilo y regresara el control a la clase que lo creo.


package model;

public class ModelHilo extends Thread {

    int id;

    public ModelHilo(int name) {
        this.id = name;
        System.out.println("Thread " + name + " Created");
    }

    @Override
    public void run() {
        System.out.println("Thread " + id + " Started");
        int i = 0;
        while (true) {
            try {
                Thread.sleep(1000); 
            } catch (InterruptedException e) {
                System.out.println("Thread " + id + " Interrupt");
                return;
            }
            System.out.println("Thread "+ id +" Working " + i++);
        }
    }
}

6.- En el controlador ControllerMain.java se creará un lista de hilos para poder crear tantos como se desea y poder detenerlos cuando el usuario lo necesite.

Con la linea de código List listaHilos = new ArrayList<>(); se crea una lista de objetos de tipo ModelHilo, lo que permitira crear tantos como sea necesario.

Con el método add se crear un nuevo Hilo.

listaHilos.add(new ModelHilo(id));


Con el indice dentro de la lista se llama al método start() con lo que el hilo comienza su ejecución.

listaHilos.get(id++).start();

Para detener todos los hilos que se crearon se utiliza un for que recorra todos los elementos de la lista y posteriormente el metodo interrumpt() que detiene la ejecución del los hilos.

for (ModelHilo hilo : listaHilos) {
hilo.interrupt();
}


package controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import view.ViewMain;
import model.ModelMain;
import model.ModelHilo;

public class ControllerMain implements ActionListener {

    ViewMain viewMain;
    ModelMain modelMain;
    int id;
    
    List listaHilos = new ArrayList<>();
    
    public ControllerMain(ViewMain viewMain, ModelMain modelMain) {
        this.viewMain = viewMain;
        this.modelMain = modelMain;
        this.viewMain.jbtnHilos.addActionListener(this);
        this.viewMain.jbtnHilosStop.addActionListener(this);
        initView();
    }

    public void initView() {
        viewMain.setTitle("Hilos en Java");
        viewMain.setLocationRelativeTo(null);
        viewMain.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == viewMain.jbtnHilos) {
            jbtnHilosActionPerformed();
        } else if (e.getSource() == viewMain.jbtnHilosStop) {
            jbtnHilosStopActionPerformed();

        }
    }

    private void jbtnHilosActionPerformed() {

        listaHilos.add(new ModelHilo(id));
        listaHilos.get(id++).start();
    }

    private void jbtnHilosStopActionPerformed() {
        for (ModelHilo hilo : listaHilos) {
            hilo.interrupt();
        }

    }
}

7.- Y por último en la clase Main.java se crea un objeto de la ViewMainModelMain ControllerMain con lo que se comenzara la ejecución del programa.

package main;
import model.ModelMain;
import view.ViewMain;
import controller.ControllerMain;

public class Main {
    public static void main(String sax[]){
        
        ModelMain modelMain = new ModelMain();
        ViewMain viewMain = new ViewMain();
        ControllerMain controllerMain = new ControllerMain(viewMain, modelMain);
    }
}


El resultado de ejecutar esta aplicación será el siguiente:



En la imagen se puede apreciar como se crean 3 hilos (Tread 0, Tread 1 y Tread 2) y posteriormente comienzan su ejecución contando de uno en uno y deteniéndose cuando reciben la orden interrupt.

Comentarios

Entradas más populares de este blog

Creación de Librerías en Java

Creación de Librerías en Java   Las librerías son un conjunto de clases con funciones especificas que ayudan a desarrollar aplicaciones más complejas de una forma sencilla, por ejemplo si se requiere realizar cálculos matemáticos y emplear el funciones como el Seno o Coseno, simplemente se importa la librería Math y se utilizan estos métodos, en lugar de desarrollarlos. Java cuenta con una extensa lista de librerías disponibles dentro del JDK o desarrolladas por terceros, pero también existe la posibilidad de desarrollar librerías propias para reutilizar de forma más eficiente el código, por ejemplo si se trabaja de forma cotidiana con conexión a base de datos, se pueden desarrollar métodos genéricos que realicen la conexión, que validen las consultas, etc. de forma que su uso reduzca el tiempo de desarrollo e incremente la productividad. Para este tutorial se van a crear dos proyectos en NetBeans, uno sera la librería y el otro proyecto hará uso de esta.

Elegir la clase a ejecutar en NetBeans, MVC

Elegir la clase a ejecutar en NetBeans Para que java pueda ejecutar una aplicación esta debe tener un método conocido como punto de entrada, este método tiene la sintaxis: void static void main(String [] sax){ //código } En ocasiones en una aplicación tiene varios puntos de entrada, que pueden servir para probar diferentes partes de la aplicación sin tener que recorrer o pasar por varias clases, para esto se puede seleccionar directamente en las propiedades del proyecto que clase será la principal.

Librerías JOptionPane para generar ventanas de entrada y salida de datos

Para poder introducir datos leídos desde el teclado existen varias formas, una de ellas hace uso de la librería javax.swing.JOptionPane que entre otras opciones permite mostrar ventanas para introducir datos, y ventanas para mostrar valores. Con el uso de esta librería se crean pequeñas interfaces definidas por el sistema, pero ya se hace uso de las librerías graficas swing, que se verán más adelante.