2013-02-25 3 views
0

У меня небольшой вопрос, пытаясь увидеть, где я собираюсь неправильно в следующем фрагменте кода:очереди Java в очередь calculaton не удовлетворены

public void processNextJob() { 
     /* 
     * 1. get # of free CPU's still avaialble 
     * 2. get top most job from priority queue 
     * 3. run job - put to CPU queue 
     * 4. develop a CPU queue here 
     * 5. count cores against freeCPUS and some sort of calculation to sort run times 
     */ 
     int freeCPUS = 500; 
     int availableCPUS = 0; 
     JobRequest temp = new JobRequest(); // initalised to new JobRequest 
     Queue q = new LinkedList(); 

     while (true) { 
      int size = q.size(); 
      for (int i = 0; i < size; i++) { 
       temp = (JobRequest) q.peek(); 
       if (temp != null) { 
        availableCPUS += temp.getCores(); 
       } 
      } 
      if ((freeCPUS - availableCPUS) >= 0) { 
       JobRequest nextJob = schedulerPriorityQueue.closestDeadlineJob(freeCPUS - availableCPUS); // returns top job from queue 
       if (nextJob != null) { 
        System.out.println("Top priority/edf job:"); 
        printJob(nextJob); 
        q.add(nextJob); 

       } else { 
        System.out.println("Job = null"); 
       } 

      } else { 
       break; 
      } 
     } 
     if (temp != null) { 

      System.out.println("Execution Queue"); 

      for(Object jr : q){ 
      printJob((JobRequest)jr);//print all elements in q 
      } 

     } 

    } 

То, что здесь происходит, что я добавив верхний элемент из приоритета и добавление его в новый LinkedList. Но задания, которые я снимаю с приоритета, имеют элемент со значением, называемым «ядрами». Я пытаюсь заставить его взять как можно больше рабочих мест, оставаясь под основным пределом.

temp.getCores() где я получить значение сердечников

Проблемы у меня в том, что он не добавляя их правильно к моей очереди LinkedList, значению она принимает в изменении оленьей кожи. Моя очередь отображает 5 выходов с ключевым значением «160», но я установил 500 кепок, поэтому очередь не удовлетворяет его вообще

Я не вижу, где я ошибаюсь, добавляя значения из PriorityQueue сделать мои доступные процессоры добраться до определенного предела его находящегося под 500.

EDIT:

public JobRequest closestDeadlineJob(int freeCPUS) { 
     // find top job to determine if other jobs for date need to be considered 
     JobRequest nextJob = scheduledJobs.peek(); // return top most job 

     if (nextJob != null) { 

      System.out.println("Found top EDF job:"); 
      printJob(nextJob); 

      // what is it's date? 
      Date highestRankedDate = nextJob.getConvertedDeadlineDate(); 

      // create a temporary queue to work out priorities of jobs with same deadline 
      JobPriorityQueue schedulerPriorityQueue = new JobPriorityQueue(); 

      // add the top job to priority queue 
      //schedulerPriorityQueue.addJob(nextJob); 

      for (JobRequest jr : scheduledJobs) { 

       // go through scheduled jobs looking for all jobs with same date 
       if (jr.getConvertedDeadlineDate().equals(highestRankedDate)) { 
        // same date deadline, soadd to scheduler priority queue 
        schedulerPriorityQueue.addJob(jr); 
        System.out.println("Adding following job to priority queue:"); 
        printJob(jr); 
       } 
      } 

      JobRequest highestPriorityJob = schedulerPriorityQueue.poll(); 
      // this is the item at the top of the PRIORTY JOB queue to return 

      // remove that item from scheduledJobs 
      scheduledJobs.remove(highestPriorityJob); 


      return highestPriorityJob; 
     } else { 
      return null; 
     } 
    } 
+0

Выполняется ли это утверждение - 'System.out.println (« Top priority/edf job: »);'? –

+0

Да, он запускает, говорит мое мое топ-задание из моего приоритета, затем добавляет это задание в связанный список, это всего лишь проверка на то, что я вижу, что он работает, все проходит, но проблема связана с тем, как я добавляю ядра, которые не работает –

+0

И можем ли мы знать, что делает метод 'closestDeadlineJob'? –

ответ

0

Я думаю, что вам нужно, чтобы посмотреть здесь.

В вашем for() цикле, где приращение переменной availableCPUS, вы всегда принимая head из Queue:

temp = (JobRequest) q.peek();

И потому, что peek() не удаляет элемент из очереди, вы в конечном итоге назначения то же JobRequest до temp.

Try используя Iterator вместо for:

availableCPUS = 0; 
Iterator<JobRequest> it = q.iterator(); 
while (it.hasNext()) { 
    temp = it.next(); 
    if (temp != null) { 
     availableCPUS += temp.getCores(); 
    } 
} 

Кроме того, я думаю, вам нужно установить availableCPUS в 0 для каждой итерации цикла в то время, чтобы иметь возможность правильно рассчитывать ядра.

Поэтому вы должны размещать availableCPUS = 0; чуть выше инициализации Итератора.

+0

нормально, но если я изменю это на: temp = (JobRequest) q.голосование(); , который удалит верхнюю часть, мой q пуст, и я не могу распечатать какой-либо из моего стека выполнения. –

+0

Вам не нужно использовать 'poll', если вы используете итератор. –

+0

ah отлично, реализуя то, что вы поставили раньше и убедившись, что доступный процессор находится в пределах моего while (true), он удовлетворяет установленному пределу, спасибо очень большое –

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