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