Diferencia entre revisiones de «Exemplo de uso de prioridades con fíos»

De MediaWiki
Ir a la navegación Ir a la búsqueda
 
(No se muestra una edición intermedia del mismo usuario)
Línea 49: Línea 49:
  
 
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é?

Créditos e referencias