不满足java队列到队列计算
我在尝试查看以下代码时遇到了一个小问题:不满足java队列到队列计算,java,linked-list,priority-queue,Java,Linked List,Priority Queue,我在尝试查看以下代码时遇到了一个小问题: 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
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
}
}
}
我想你需要看看这里 在增加
availableCPUS
变量的for()
循环中,始终使用队列的头
:
temp=(作业请求)q.peek()代码>
由于peek()
不会从队列中删除元素,因此最终会将相同的JobRequest
分配给temp
尝试使用迭代器,而不是for
:
availableCPUS = 0;
Iterator<JobRequest> it = q.iterator();
while (it.hasNext()) {
temp = it.next();
if (temp != null) {
availableCPUS += temp.getCores();
}
}
availableCPUS=0;
迭代器it=q.Iterator();
while(it.hasNext()){
temp=it.next();
如果(温度!=null){
availableCPUS+=temp.getCores();
}
}
另外,我认为您需要为while循环的每次迭代将availableCPUS
设置为0
,以便能够正确地计算核心数
所以你应该把availableCPUS=0
就在迭代器初始化的上方。此语句是否执行过-System.out.println(“最高优先级/edf作业:”)代码>?是的,它运行时会从我的优先级队列中告诉我我的首要作业,然后将该作业添加到链接列表中,这只是检查它是否工作,这一切都贯穿始终,但问题在于我如何添加不起作用的内核,我们是否可以知道closestDeadlineJob
方法在做什么?似乎closestDeadlineJob
没有返回预期的JobRequest
。当它运行时,它返回我队列的顶部,在调试时查看它,它似乎返回的很好,只是新的内核的计算很好,编辑为添加closestDeadlineJobok,但是如果我将其更改为:temp=(JobRequest)q.poll();这将删除顶部,我的q是空的,我不能打印我的任何执行堆栈。如果使用迭代器,您不需要使用poll
。啊,太好了,通过实现您之前放置的内容,并确保可用CPU在我的范围内,而它满足设置的限制,非常感谢
availableCPUS = 0;
Iterator<JobRequest> it = q.iterator();
while (it.hasNext()) {
temp = it.next();
if (temp != null) {
availableCPUS += temp.getCores();
}
}