972
Capítulo 23 Subprocesamiento múltiple
Observe que
SwingWorker
es una clase genérica. En la línea 8, el primer parámetro de tipo es
String
y
el segundo es
Object
. El primer parámetro de tipo indica el tipo devuelto por el método
doInBackground
; el
segundo indica el tipo que se pasa entre los métodos
publish
y
process
para manejar los resultados intermedios.
Como no utilizamos a
publish
o a
process
en este ejemplo, simplemente usamos
Object
como el segundo
parámetro de tipo. En la sección 23.11.2 hablaremos sobre
publish
y
process
.
Un objeto
CalculadoraSegundoPlano
puede instanciarse a partir de una clase que controle una GUI. Un
objeto
CalculadoraSegundoPlano
mantiene variables de instancia para un entero que representa el número de
Fibonacci a calcular, y un objeto
Jlabel
que muestra los resultados del cálculo (líneas 10 y 11). El constructor
de
CalculadoraSegundoPlano
(líneas 14 a 18) inicializa estas variables de instancia con los argumentos que se
pasan al constructor.
Observación de ingeniería de software 23.3
Cualquier componente de la GUI que se manipule mediante métodos de
SwingWorker
, como los componentes que
se actualizan a partir de los métodos
process
o
done
, se debe pasar al constructor de la subclase de
SwingWorker
para almacenarlo en el objeto de la subclase. Esto proporciona a estos métodos acceso a los componentes de la GUI
que van a manipular.
Cuando se hace una llamada al método
execute
en un objeto
CalculadoraSegundoPlano
, el objeto se
programa para ejecutarlo en un subproceso trabajador. El método
doInBackground
se llama desde el subproceso
trabajador e invoca al método
fibonacci
(líneas 47 a 53), en donde recibe la variable de instancia
n
como argu-
mento (línea 23). El método
fibonacci
utiliza la recursividad para calcular el número de Fibonacci de
n
. Cuando
fibonacci
regresa, el método
doInBackground
devuelve el resultado.
24
return
String.valueOf( nesimoFib );
25
}
// fin del método doInBackground
26
27
// código para ejecutar en el subproceso de despachamiento de eventos cuando regresa
doInBackground
28
protected void
done()
29
{
30
try
31
{
32
// obtiene el resultado de doInBackground y lo muestra
33
resultadoJLabel.setText( get() );
34
}
// fin de try
35
catch
( InterruptedException ex )
36
{
37
resultadoJLabel.setText(
"Se interrumpio mientras esperaba los resultados."
);
38
}
// fin de catch
39
catch
( ExecutionException ex )
40
{
41
resultadoJLabel.setText(
42
"Se encontro un error al realizar el calculo."
);
43
}
// fin de catch
44
}
// fin del método done
45
46
// método recursivo fibonacci; calcula el n-ésimo número de Fibonacci
47
public long
fibonacci(
long
numero )
48
{
49
if
( numero ==
0
|| numero ==
1
)
50
return
numero;
51
else
52
return
fibonacci( numero -
1
) + fibonacci( numero -
2
);
53
}
// fin del método fibonacci
54
}
// fin de la clase CalculadoraSegundoPlano
Figura 23.25
| Subclase de
SwingWorker
para calcular números de Fibonacci en un subproceso en segundo plano.
(Parte 2 de 2).
23_MAQ_CAP_23_DEITEL.indd972
4/19/081:33:56AM