в Java я не могу присваивать значения переменным, пока я нахожусь в функции run () класса с расширенным потоком - PullRequest
0 голосов
/ 01 ноября 2009

Это мой код. Как вы видите в методе run, я присваиваю значения tStart, tEnd, tAround и wTime. Но когда поток заканчивается, они все равно имеют значения по умолчанию -1. Я пытаюсь распечатать их значения во время выполнения run (), и у меня есть правильные значения. Но они не «записывают» эти значения обратно в переменные, когда заканчивается поток.

public class PCB extends Thread{
    public int id, arrivalTime, cpuBurst, ioBurst;
    public int tStart, tEnd, tAround, wTime;
    public PCB(){
        id = -1;
        arrivalTime = -1;
        cpuBurst = -1;
        ioBurst = -1;

        tStart = -1;
        tEnd = -1;
        tAround = -1;
        wTime = -1;
    }

 public void run(){
        try{
    .........

            //calculation for FCFS 
            if (id == 1){ //special case for the first one
                tStart = arrivalTime;
            }
            else tStart = lastEndTime;

            tEnd = tStart + cpuBurst + ioBurst;
            tAround = tEnd - arrivalTime;
            wTime = tStart - arrivalTime;

                            PCBThreadStopFlag = true;   

        }
        catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

Когда поток заканчивается, вот как я распечатываю значения:

        // now we print out the process table
    String format = "|P%1$-10s|%2$-10s|%3$-10s|%4$-10s|%5$-10s|%6$-10s|%7$-10s|%8$-10s|\n";
    System.out.format(format, "ID", "ArrTime", "CPUBurst", "I/OBurst", "TimeStart", "TimeEnd","TurnAround","WaitTime");
    ListIterator<PCB> iter = resultQueue.listIterator();
    while(iter.hasNext()){
        PCB temp = iter.next();
        System.out.format(format, temp.id, temp.arrivalTime, temp.cpuBurst, temp.ioBurst, temp.tStart, temp.tEnd, temp.tAround, temp.wTime );
    }

А вот как я ждал, когда поток остановится первым:

while(!rq.values.isEmpty()){
            //System.out.println("Ready queue capacity now: " + rq.values.size());
            currentProcess = new PCB(rq.values.getFirst());
            currentProcess.start();

            while(PCBThreadStopFlag == false) {}
            //currentProcess.stop();
            PCBThreadStopFlag = false;

            //after everything is done, remove the first pcb
            // and add it to the result queue (just to print the report)
            resultQueue.addLast(rq.values.removeFirst());           
        }

Я использую флаг PCBThreadStopFlag в верхней части run () (в конце, когда все назначения выполнены), затем в этой функции я использую while (PCBThreadStopFlag == false) {}, чтобы выполнить «busy-wait» задача. может быть в этом причина ??

1 Ответ

3 голосов
/ 01 ноября 2009

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

РЕДАКТИРОВАТЬ: ОК, попробуйте это ...

Идея № 1: Объявите PCBThreadStopFlag как изменчивый и повторите попытку. Скажите нам, если это работает.

Идея № 2: полностью избавиться от флага остановки и заменить ожидание занятости на

currentProcess.join();

и скажите нам, если это работает.

...