Diferencia entre revisiones de «Exemplo de uso de prioridades con fíos»
Ir a la navegación
Ir a la búsqueda
| (No se muestran 3 ediciones intermedias del mismo usuario) | |||
| Línea 16: | Línea 16: | ||
DemoPrioridadGet t3 = new DemoPrioridadGet(); | DemoPrioridadGet t3 = new DemoPrioridadGet(); | ||
| − | System.out.println("Prioridad del hilo t1 : " + | + | System.out.println("Prioridad del hilo t1 : " + t1.getPriority()); // Por defecto 5 |
| − | + | System.out.println("Prioridad del hilo t2 : " + t2.getPriority()); // Por defecto 5 | |
| − | System.out.println("Prioridad del hilo t2 : " + | + | System.out.println("Prioridad del hilo t3 : " + t3.getPriority()); // Por defecto 5 |
| − | |||
| − | System.out.println("Prioridad del hilo t3 : " + | ||
| − | |||
t1.setPriority(2); | t1.setPriority(2); | ||
| Línea 27: | Línea 24: | ||
t3.setPriority(8); | t3.setPriority(8); | ||
| − | // t3.setPriority( | + | // t3.setPriority(11); arrojará IllegalArgumentException |
| − | System.out.println("Prioridad del hilo t1 : " + | + | System.out.println("Prioridad del hilo t1 : " + t1.getPriority()); //2 |
| − | + | System.out.println("Prioridad del hilo t2 : " + t2.getPriority()); //5 | |
| − | System.out.println("Prioridad del hilo t2 : " + | + | System.out.println("Prioridad del hilo t3 : " + t3.getPriority());//8 |
| − | |||
| − | System.out.println("Prioridad del hilo t3 : " + | ||
| − | |||
// Hilo Principal (Main thread) | // Hilo Principal (Main thread) | ||
System.out.print(Thread.currentThread().getName()+": "); | System.out.print(Thread.currentThread().getName()+": "); | ||
| − | System.out.println("Prioridad del hilo Main : " | + | System.out.println("Prioridad del hilo Main : " + Thread.currentThread().getPriority()); |
| − | |||
// La prioridad del hilo principal se establece en 10 | // La prioridad del hilo principal se establece en 10 | ||
Thread.currentThread().setPriority(10); | Thread.currentThread().setPriority(10); | ||
| − | System.out.println("Prioridad del hilo Main : " | + | System.out.println("Prioridad del hilo Main : " + Thread.currentThread().getPriority()); |
| − | |||
} | } | ||
} | } | ||
| Línea 49: | Línea 41: | ||
a) entre os fíos t1, t2 e t3... cal cres que terá maior probabilidade de execución? | 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? | b) cal é a prioridade por defecto do fío main? | ||
| + | |||
c) cal é a prioridade por defecto dos fíos que herdan de 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? | 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? | e) Se lle asignamos a un fío prioridade 11... qué acontece? | ||
| + | |||
| + | = Enunciado 2 = | ||
| + | Responde as preguntas sobre o seguinte código: | ||
| + | |||
| + | :<syntaxhighlight lang="java" line enclose="div" highlight="" > | ||
| + | //Demostración de prioridades en hilos | ||
| + | class PrioridadHilos implements Runnable { | ||
| + | int contar; | ||
| + | Thread hilo; | ||
| + | |||
| + | static boolean stop=false; | ||
| + | static String actualNombre; | ||
| + | |||
| + | //Construye un nuevo hilo. | ||
| + | PrioridadHilos(String nombre){ | ||
| + | hilo= new Thread(this,nombre); | ||
| + | contar=0; | ||
| + | actualNombre=nombre; | ||
| + | } | ||
| + | |||
| + | //Punto de entrada de hilo. | ||
| + | public void run(){ | ||
| + | System.out.println(hilo.getName()+" iniciando."); | ||
| + | do { | ||
| + | contar++; | ||
| + | if (actualNombre.compareTo(hilo.getName())!=0){ | ||
| + | actualNombre=hilo.getName(); | ||
| + | System.out.println("En "+actualNombre); | ||
| + | } | ||
| + | }while (stop==false&&contar<10000000); | ||
| + | stop=true; | ||
| + | System.out.println("\n"+ hilo.getName()+" terminado."); | ||
| + | } | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | :<syntaxhighlight lang="java" line enclose="div" highlight="" > | ||
| + | class DemoPrioridad{ | ||
| + | public static void main(String[] args) { | ||
| + | PrioridadHilos ph1= new PrioridadHilos("Prioridad Alta"); | ||
| + | PrioridadHilos ph2= new PrioridadHilos("Prioridad Baja"); | ||
| + | PrioridadHilos ph3= new PrioridadHilos("Prioridad Normal #1"); | ||
| + | PrioridadHilos ph4= new PrioridadHilos("Prioridad Normal #2"); | ||
| + | PrioridadHilos ph5= new PrioridadHilos("Prioridad Normal #3"); | ||
| + | |||
| + | //Establecer prioridades | ||
| + | ph1.hilo.setPriority(Thread.NORM_PRIORITY+2); | ||
| + | ph2.hilo.setPriority(Thread.NORM_PRIORITY-2); | ||
| + | //Deje ph3, ph4 y ph5 en el nivel de prioridad normal predeterminado | ||
| + | |||
| + | //Comenzar los hilos | ||
| + | ph1.hilo.start(); | ||
| + | ph2.hilo.start(); | ||
| + | ph3.hilo.start(); | ||
| + | ph4.hilo.start(); | ||
| + | ph5.hilo.start(); | ||
| + | try { | ||
| + | ph1.hilo.join(); | ||
| + | ph2.hilo.join(); | ||
| + | ph3.hilo.join(); | ||
| + | ph4.hilo.join(); | ||
| + | ph5.hilo.join(); | ||
| + | }catch (InterruptedException exc){ | ||
| + | System.out.println("Hilo principal interrumpido."); | ||
| + | } | ||
| + | System.out.println("\nHilo de alta prioridad contó hasta "+ph1.contar); | ||
| + | System.out.println("Hilo de baja prioridad contó hasta "+ph2.contar); | ||
| + | System.out.println("Hilo de normal prioridad #1 contó hasta "+ph3.contar); | ||
| + | System.out.println("Hilo de normal prioridad #2 contó hasta "+ph4.contar); | ||
| + | System.out.println("Hilo de normal prioridad #3 contó hasta "+ph5.contar); | ||
| + | } | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | 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 = | = Créditos e referencias = | ||
* [https://www.geeksforgeeks.org/java-thread-priority-multithreading/ Java thread priority] | * [https://www.geeksforgeeks.org/java-thread-priority-multithreading/ Java thread priority] | ||
* [https://javadesdecero.es/avanzado/prioridad-de-hilos/ Prioridad de hilos] | * [https://javadesdecero.es/avanzado/prioridad-de-hilos/ Prioridad de hilos] | ||
Revisión actual del 17:10 2 nov 2021
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é?