Java
En Java para utilizar la multitarea debemos de usar la clase
Thread (es decir que la clase
que implementemos debe
heredar de la clase Thread) y la clase Thread implementa
la
Interface
Runnable
. En el siguiente diagrama de clase mostramos la Interface Runnable y
la clase Thread con sus principales métodos:
¿Y si en vez de procesar primero un cliente y después otro, procesásemos los dos a la vez?,
¿Cuanto tardaría el programa en ejecutarse?. Pues bien si en vez de haber solo una Cajera
(es decir un solo hilo), hubiese dos Cajeras (es decir dos hilos o threads) podríamos procesar
los dos clientes a la vez y tardar menos tiempo en ejecutarse el programa. Para ello debemos
de modificar la clase “Cajera.java
” y hacer que esta clase herede de la clase
Thread para
heredar y sobreescribir algunos de sus métodos. Primero vamos a ver como codificamos
esta nueva clase “
CajeraThread.java
” y después explicamos sus caracteristicas.
public
class
CajeraThread
extends
Thread
{
private
String
nombre;
private
Cliente
cliente;
private
long
initialTime;
// Constructor, getter & setter
@Override
public
void
run() {
System
.
out
.println(
"La cajera "
+
this
.nombre +
" COMIENZA A PROCESAR LA
COMPRA DEL CLIENTE "
+
this
.cliente.getNombre() +
" EN EL TIEMPO: "
+ (
System
.currentTimeMillis()
this
.initialTime) /
1000
+
"seg"
);
for
(
int
i =
0
; i < this
.cliente.getCarroCompra().length; i++) {
this
.esperarXsegundos(cliente.getCarroCompra()[i]);
System
.
out
.println(
"Procesado el producto "
+ (i +
1
)
+
" del cliente "
+
this
.cliente.getNombre() +
">Tiempo: "
+ (
System
.currentTimeMillis()
this
.initialTime) /
1000
+
"seg"
);
}
System
.
out
.println(
"La cajera "
+
this
.nombre + " HA TERMINADO DE
PROCESAR "
+
this
.cliente.getNombre() +
" EN EL TIEMPO: "
+ (
System
.currentTimeMillis()
this
.initialTime) /
1000
+
"seg"
);
}
private
void
esperarXsegundos(
int
segundos) {
try
{
Thread
.sleep(segundos *
1000
);
}
catch
(
InterruptedException
ex) {
Thread
.currentThread().interrupt();
}
}
}
Lo primero que vemos y que ya hemos comentado es que la clase “CajeraThread” debe de
heredar de la clase Thread: “
extendsThread
“.
Otra cosa importante que vemos es que hemos sobreescrito el método “
run()
” (de ahi la
etiqueta
@Override
) . Este método es imprescindibles sobreescribirlo (ya que es un método
que esta en la clase Runnable y la clase Thread Implementa esa Interface) porque en él se
va a codificar la funcionalidad que se ha de ejecutar en un hilo; es decir, que lo que se
programe en el método “
run()
” se va a ejecutar de forma secuencial en un hilo. En esta clase
“CajeraThread” se pueden sobreescribir más métodos para que hagan acciones sobre el hilo
o thread como por ejemplo, parar el thread, ponerlo en reposos, etc. A continuación vamos a
ver como programamos el método Main para que procese a los clientes de forma paralela y
ver como se tarda menos en procesar todo. El método Main esta en la clase
“
MainThread.java
” que tiene el siguiente contenido:
public
class
MainThread
{
public
static
void
main(
String
[] args) {
Cliente
cliente1 =
new
Cliente
(
"Cliente 1"
,
new
int
[] {
2
,
2
,
1
,
5
,
2
,
3
});
Cliente
cliente2 =
new
Cliente
(
"Cliente 2"
,
new
int
[] {
1
,
3
,
5
,
1
,
1
});
// Tiempo inicial de referencia
long
initialTime =
System
.currentTimeMillis();
CajeraThread
cajera1 =
new
CajeraThread
(
"Cajera 1"...
Regístrate para leer el documento completo.