Exemplo de uso de prioridades con fíos

De MediaWiki
Ir a la navegación Ir a la búsqueda

Enunciado 1

Responde as preguntas sobre o seguinte código:

 1 class DemoPrioridadGet extends Thread
 2 {
 3     public void run()
 4     {
 5         System.out.println("Dentro del método run");
 6     }
 7 
 8     public static void main(String[]args)
 9     {
10         DemoPrioridadGet t1 = new DemoPrioridadGet();
11         DemoPrioridadGet t2 = new DemoPrioridadGet();
12         DemoPrioridadGet t3 = new DemoPrioridadGet();
13 
14         System.out.println("Prioridad del hilo t1 : " + t1.getPriority()); // Por defecto 5
15         System.out.println("Prioridad del hilo t2 : " + t2.getPriority()); // Por defecto 5
16         System.out.println("Prioridad del hilo t3 : " + t3.getPriority()); // Por defecto 5
17 
18         t1.setPriority(2);
19         t2.setPriority(5);
20         t3.setPriority(8);
21 
22         // t3.setPriority(11); arrojará IllegalArgumentException
23         System.out.println("Prioridad del hilo t1 : " + t1.getPriority());  //2
24         System.out.println("Prioridad del hilo t2 : " + t2.getPriority()); //5
25         System.out.println("Prioridad del hilo t3 : " + t3.getPriority());//8
26 
27         // Hilo Principal (Main thread)
28         System.out.print(Thread.currentThread().getName()+": ");
29         System.out.println("Prioridad del hilo Main : " + Thread.currentThread().getPriority());
30 
31         // La prioridad del hilo principal se establece en 10
32         Thread.currentThread().setPriority(10);
33         System.out.println("Prioridad del hilo Main : " + Thread.currentThread().getPriority());
34     }
35 }

a) entre os fíos t1, t2 e t3... cal cres que terá maior probabilidade de execución?

b) cal é a prioridade por defecto do fío main?

c) cal é a prioridade por defecto dos fíos que herdan de main?

d) Se dous fios teñen a mesma prioridade, cal pensas que se executará primeiro?

e) Se lle asignamos a un fío prioridade 11... qué acontece?

Enunciado 2

Responde as preguntas sobre o seguinte código:

 1 //Demostración de prioridades en hilos
 2 class PrioridadHilos implements Runnable {
 3     int contar;
 4     Thread hilo;
 5 
 6     static boolean stop=false;
 7     static String actualNombre;
 8 
 9     //Construye un nuevo hilo.
10     PrioridadHilos(String nombre){
11         hilo= new Thread(this,nombre);
12         contar=0;
13         actualNombre=nombre;
14     }
15 
16     //Punto de entrada de hilo.
17     public void run(){
18         System.out.println(hilo.getName()+" iniciando.");
19         do {
20             contar++;
21             if (actualNombre.compareTo(hilo.getName())!=0){
22                 actualNombre=hilo.getName();
23                 System.out.println("En "+actualNombre);
24             }
25         }while (stop==false&&contar<10000000);
26         stop=true;
27         System.out.println("\n"+ hilo.getName()+" terminado.");
28     }
29 }
 1 class DemoPrioridad{
 2     public static void main(String[] args) {
 3     PrioridadHilos ph1= new PrioridadHilos("Prioridad Alta");
 4     PrioridadHilos ph2= new PrioridadHilos("Prioridad Baja");
 5     PrioridadHilos ph3= new PrioridadHilos("Prioridad Normal #1");
 6     PrioridadHilos ph4= new PrioridadHilos("Prioridad Normal #2");
 7     PrioridadHilos ph5= new PrioridadHilos("Prioridad Normal #3");
 8 
 9     //Establecer prioridades
10         ph1.hilo.setPriority(Thread.NORM_PRIORITY+2);
11         ph2.hilo.setPriority(Thread.NORM_PRIORITY-2);
12      //Deje ph3, ph4 y ph5 en el nivel de prioridad normal predeterminado
13 
14      //Comenzar los hilos
15         ph1.hilo.start();
16         ph2.hilo.start();
17         ph3.hilo.start();
18         ph4.hilo.start();
19         ph5.hilo.start();
20     try {
21         ph1.hilo.join();
22         ph2.hilo.join();
23         ph3.hilo.join();
24         ph4.hilo.join();
25         ph5.hilo.join();
26     }catch (InterruptedException exc){
27         System.out.println("Hilo principal interrumpido.");
28     }
29         System.out.println("\nHilo de alta prioridad contó hasta "+ph1.contar);
30         System.out.println("Hilo de baja prioridad contó hasta "+ph2.contar);
31         System.out.println("Hilo de normal prioridad #1 contó hasta "+ph3.contar);
32         System.out.println("Hilo de normal prioridad #2 contó hasta "+ph4.contar);
33         System.out.println("Hilo de normal prioridad #3 contó hasta "+ph5.contar);
34     }
35 }

Resumidamente:

  • O método run() conten un bucle que conta o número de iteracións.
  • O ciclo detense cando o contador chega a 10.000.000 ou a variable estática stop es true.
    • Inicialmente, stop establécese en false, pero o primeiro fío en alcanzar o límite de conteo establece stop en true: isto provoca que cada fío termine co seu seguinte segmento de tempo.
  • Cada vez que se pasa polo ciclo, a cadea nombreActual compárase co nome do fío que se está executando.
    • Se non coinciden significa que se producçiu un cambio de tarefa; e cada vez que se produce un cambio de tarefa, amosase o nome do novo fío e se lle asigna ó nombreActual o nome do novo fío.
  • A visualización de cada cambio de fío permite ver cando os fíos obteñen acceso á CPU.
    • Despois de deter os fios, amosase o número de iteracións para cada ciclo.

a) Qué fai o método join? Que acontece se comentas algunha das súas chamadas? b) Cal fío remata primeiro? Por qué? c) Executa o programa varias veces. Obtes sempre os mesmos resultados? Por qué?

Créditos e referencias