Exemplo de uso de prioridades con fíos
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é?