不满足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();
    }
}