在java中执行机器调度的循环算法



在数据库中,我有一个表,其中包括每台机器的machine_idburst_time

mach_id      burst_time
1               3
2               2
3               1
4               2
5               4

我的循环算法代码是:

    ResultSet rs = stmt1.executeQuery("select burst_time from virtual_machine WHERE VM_id <= '"
                                            + size + "'");
                while (rs.next()) {
                                                            list22.add(rs.getString("burst_time"));
            }
            long[] bur = new long[list22.size()];
            long[] rem = new long[list22.size()];
        for (int i = 0; i < list22.size(); i++) {
        SimpleDateFormat formatter1 = new SimpleDateFormat("HH:mm:ss");
                                                        formatter1.setTimeZone(TimeZone.getTimeZone("GMT"));
 try {
        java.util.Date d1 = formatter1.parse(list22.get(i));
    long btm = d1.getTime();
    rem[i] = bur[i] = btm;
   } catch (java.text.ParseException e1) {
    System.err.println("Error: " + e1.getMessage());
    }
                }
    List<Integer> execOrder = new ArrayList<Integer>();
    //for (long currTime = System.currentTimeMillis(); currTime <=currTime+ et1; currTime += 10 * 1000) {
    do {
        flagClounter = 0;
        for (int i = 0; i < size; i++) {
            if (rem[i] > 0) {
                if (rem[i] > qtm) {
                    execOrder.add(i + 1);
                    rem[i] = rem[i] - qtm;
                    flagClounter++;
                    // Thread.sleep(40000);
                } else {
                    execOrder.add(i + 1);
                    rem[i] = 0;
                    flagClounter++;
                }
            }
        }
        //flagClounter++;
    } while (flagClounter > 0);
    for (int i = 0; i < execOrder.size(); i++) {
        System.out.println("nVM " + execOrder.get(i));
    }

在这里,循环概念很好。。当时间量=2 时,它会打印以下内容

1 2 3 4 5 1 5

但我想要的是打印精确的machine_id's,而不是存储在数组中的上述整数值,它会随着循环而递增。。我如何获得存储在数据库中的要在程序中使用的确切machine_id,并在调度后以上述相同的形式打印它。。。有谁能帮我把它放在节目中吗。。。。

rem似乎是剩余突发时间的数组。如果它是一个对象数组,每个对象代表一台机器,那么剩余的突发时间和机器id(以及您想要的任何其他信息)都可以打印。

您也可以创建第二个数组,名称为(例如)mid,使mid[i]是与在rem[i]中跟踪其时间的机器相关联的机器id。现在,您应该执行execOrder.add(mid[i])而不是execOrder.add(i+1)

您可以对代码进行以下更改:

Map<Integer, Integer> machine = new HashMap<Integer, Integer>();    
//Map 'machine' will store each entry as machine_id, burst_time
ResultSet rs = stmt1.executeQuery("select burst_time, machine_id from virtual_machine              WHERE VM_id <= '"+ size + "'");
    while (rs.next()) {
          machine.put(rs.getInt("machine_id"), rs.getInt("burst_time");
    }

您所有的突发时间都以机器id为密钥。这样您就可以打印相应的机器id,而不是突发时间。

最新更新