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 ViewMain, ModelMain y 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