2014-12-30 5 views
0

Цель: нужно было подсчитать, сколько раз было доступно обращение к потокам с высоким приоритетом и низким приоритетом. // Когда я компилирую следующий код, «h» (int h, стоящий для максимума) остается равным нулю, но «l» (низкий) увеличивается.Подсчет приоритета нити - Java

class Priority implements Runnable { 
    int high = 0; 
    int low = 0; 
    int count; Thread thrd; 
    static boolean stop = false; 
    static String currentName; 
    Priority(String name) { 
     thrd = new Thread(this, name); 
     count = 0; 
     currentName = name; 
    } 
    public void run() { 
    System.out.println(thrd.getName() + " starting."); 
    do { 
     count++; 

     if(currentName.compareTo(thrd.getName()) != 0) { 
     currentName = thrd.getName(); 
     System.out.println("In " + currentName); 
     System.out.println("Name in thrd is " + thrd.getName()); 
     System.out.println("name in currentName is " + currentName); 
     if ("High Priority" == currentName) h++; 
     if ("Low Priority" == currentName) l++; 
     } 
     } while(stop == false && count<10); 

    stop = true; 
    System.out.println("\n" + thrd.getName() + " terminating."); 
    } 
    } 

    class PriorityDemo { 
    public static void main(String args[]) { 
     Priority mt1 = new Priority("High Priority"); 
     Priority mt2 = new Priority("Low Priority"); 
     mt1.thrd.setPriority(Thread.NORM_PRIORITY+2); 
     mt2.thrd.setPriority(Thread.NORM_PRIORITY-2); 

     mt1.thrd.start(); 
     mt2.thrd.start(); 

     try { 
     mt1.thrd.join(); 
     mt2.thrd.join(); 
     } catch(InterruptedException e) { 
     System.out.println("Main thread interrupted."); 
     } 

     System.out.println("\n High priority thread counted to " + mt1.count); 
     System.out.println("'n Low priority thread counted to " + mt2.count); 
     System.out.println("In 'mt1' \nhigh is " + mt1.h + " and low is " + mt1.l); 
     System.out.println("In 'mt2' \nhigh is " + mt2.h + " and low is " + mt2.l); 
    } 
    } 

Последние две строки исполняемого кода заключаются в следующем: высоко в MT1 является на низком уровне является (например, дл) 985 высоко в MT2 является на низком уровне является 985!

Я также пробовал // if ("High Priority" == thrd.getName()) h ++; if ("Low Priority" == thrd.getName()) l ++; Но это тоже не получилось.

+1

использование „Высокий приоритет“ .equals (thrd.getName()) – tgkprog

+1

Или лучше enum или final String/int, чтобы обозначить «High Priority» ... – tgkprog

+0

это тоже багги. if (currentName.compareTo (thrd.getName())! = 0) { currentName = thrd.getName(); Другое дело, что потоковые программы - забавные, но бесполезные для большинства разработчиков приложений. сосредоточиться на j2ee и коллекциях ...если вы не учитесь в школе, и это академический – tgkprog

ответ

0

Это может помочь. если я предполагал, ваши цели правильно

package tst; 

public class PriorityDemo { 
    public static void main(String args[]) { 
     Priority mtHigh = new Priority(Priority.HIGH); 
     Priority mtLow = new Priority(Priority.LOW); 
     mtHigh.thrd.setPriority(Thread.NORM_PRIORITY + 3); 
     mtLow.thrd.setPriority(Thread.NORM_PRIORITY - 3); 

     mtHigh.thrd.start(); 
     mtLow.thrd.start(); 

     try { 
      mtHigh.thrd.join(); 
      mtLow.thrd.join(); 
     } catch (InterruptedException e) { 
      System.out.println("Main thread interrupted."); 
     } 

     System.out.println("v 2\n High priority thread counted to " + mtHigh.count); 
     System.out.println("'n Low priority thread counted to " + mtLow.count); 
     System.out.println("In 'mtHigh' \nhigh is " + mtHigh.high + " and low is " + mtHigh.low); 
     System.out.println("In 'mtLow' \nhigh is " + mtLow.high + " and low is " + mtLow.low); 
    } 
} 

class Priority implements Runnable { 
    public final static String HIGH = "High Priority"; 
    public final static String LOW = "Low Priority"; 
    int high = 0; 
    int low = 0; 
    int count; 
    Thread thrd; 
    static boolean stop = false; 
    String currentName;// why static? 

    Priority(String name) { 
     thrd = new Thread(this, name); 
     count = 0; 
     currentName = name; 
    } 

    public void run() { 
     System.out.println(thrd.getName() + " starting."); 
     do { 
      count++; 
      System.out.println("\nThrd " + thrd.getName() + " count " + count); 
      if (thrd.getName().contains(currentName)) { 
       // currentName = thrd.getName(); 
       //System.out.println("In " + currentName); 
       System.out.println("Name in thrd is " + thrd.getName()); 
       System.out.println("name in currentName is " + currentName); 
       if (currentName.contains(HIGH)) 
        high++; 
       if (currentName.contains(LOW)) 
        low++; 
      } 
     } while (stop == false && count < 10); 

     stop = true;//this static so high runs faster and stops low before its count is 10 
     System.out.println("\n" + thrd.getName() + " terminating."); 
    } 
} 

выход я получил:

Низкий приоритет запуска. Высокий приоритет.

Thrd Неприоритетные Количество 1

Thrd высокий приоритет Количество 1 Имя в thrd является высоким приоритетом Имя в thrd Низкий имя Приоритет в currentName Низкий приоритет название в currentName является высоким приоритетом

Thrd High Количество Priority 2 имя в thrd является Высоким имя Приоритет в currentName является высоким приоритетом

Thrd высокий приоритет счетчик 3 имя в thrd является высокий приоритет название в currentName является высоким приоритетом

Thrd Низкий приоритет Количество 2 Имя в thrd Низкий приоритет название в currentName является низким приоритетом

Thrd высокий приоритет 4 Количество

Thrd Низкий приоритет Количество 3 Имя в thrd Низкий приоритет название в currentName низкий приоритет имя в thrd является высокий приоритет название в currentName является высокий приоритет

thrd низкий приоритет 4 Количество имя в thrd является низким приоритетом

Thrd высокий приоритет Количество 5 Имя в thrd является высокий приоритет название в currentName является высоким приоритетом

Thrd высокий приоритет счетчик 6 Имя в thrd является Высоким имя Приоритет в currentName является низким приоритетом

Thrd Количество низкого приоритета 5 имя в thrd низкий приоритет название в currentName является низким приоритетом

thrd низкий приоритет счетчик 6 имя в thrd низкий приоритет название в currentName является низким приоритетом

Thrd Низкий приоритет счетчик 7 Имя в thrd Низкий приоритет название в currentName является низким приоритетом

Thrd Низкий приоритет Количество 8 Имя в thrd Низкий приоритет название в currentName является низким приоритетом

Thrd Количество низкого приоритета 9 имя в thrd низкий приоритет название в currentName является низким приоритетом

Thrd Неприоритетные счетчик 10 имя в thrd низкий приоритет название в currentName является низким приоритетом

Low Прио прекращение действия. name в currentName - высокий приоритет

Высокий приоритет завершающий. v 2 высокий приоритет потока подсчитывают до 6 н низкий приоритет нити подсчитывались до 10 В „mtHigh“ высокий 6 и низкий 0 В „mtLow“ высоко равно 0 и низкий 10

+0

он может пойти с синхронизацией также. либо он может создать синхронизацию блока или метода. – Prashant

+0

Нет необходимости в Synchronize.no Доступны две изменяемые переменные в потоках. Ну, кроме остановки, но это вряд ли проблема, поскольку она просто становится истиной в одном месте и проверяется в другой теме. сомневаюсь, что в учебном проекте будет какой-то побочный эффект, за исключением того, что поток с низким приоритетом будет выполняться для дополнительной итерации. – tgkprog

+0

Еще раз спасибо tgkprog! А также вам Prashant, за ваше предложение: D –

Смежные вопросы