подтверждение выполнения программы - PullRequest
0 голосов
/ 02 марта 2010

может кто-нибудь сказать, будет ли код ниже работать нормально?

class CriticalSection{

int iProcessId, iCounter=0;

public static boolean[] freq = new boolean[Global.iParameter[2]];

int busy;

//constructors

CriticalSection(){}

CriticalSection(int iPid){
    this.iProcessId = iPid;
}

int freqAvailable(){

for(int i=0; i<
Global.iParameter[2]; i++){

        if(freq[i]==true){
            //this means that there is no frequency available and the request will be dropped
            iCounter++;
        }   
    }
    if(iCounter == freq.length)
        return 3;

    BaseStaInstance.iNumReq++;
    return enterCritical();
}

int enterCritical(){

    int busy=0;
    for(int i=0; i<Global.iParameter[2]; i++){
        if(freq[i]==true){
            freq[i] = false;
            break;
        }
    }
    //implement a thread that will execute the critical section simultaneously as the (contd down)
    //basestation leaves it critical section and then generates another request
    UseFrequency freqInUse = new UseFrequency;
    busy = freqInUse.start(i);

//returns control back to the main program

    return 1;   
}
}

class UseFrequency extends Thread {

    int iFrequency=0;

     UseFrequency(int i){
        this.iFrequency = i;
     }
     //this class just allows the frequency to be used in parallel as the other basestations carry on making requests
    public void run() {
        try {
            sleep(((int) (Math.random() * (Global.iParameter[5] - Global.iParameter[4] + 1) ) + Global.iParameter[4])*1000);
        } catch (InterruptedException e) { }
    }

    CriticalSection.freq[iFrequency] = true;

    stop();

}  

Ответы [ 2 ]

2 голосов
/ 02 марта 2010

Нет, этот код даже не скомпилируется. Например, ваш класс «UseFrequency» имеет конструктор и метод run (), но тогда у вас есть две строки CriticalSection.freq[iFrequency] = true; и stop();, которых нет ни в одном теле метода - они просто сидят там сами по себе.

Если вы получите код для компиляции, он все равно не будет работать так, как вы ожидаете, потому что у вас есть несколько потоков и отсутствует контроль параллелизма. Это означает, что разные потоки могут «наступать друг на друга» и повреждать общие данные, например, массив «freq». Каждый раз, когда у вас есть несколько потоков, вам нужно защитить доступ к общим переменным с помощью синхронизированного блока. Учебник Java по параллелизму объясняет это здесь http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html

0 голосов
/ 02 марта 2010

Вы пробовали скомпилировать и протестировать его? Вы используете IDE как Eclipse ? Вы можете просмотреть свою программу в отладчике, чтобы увидеть, что она делает. То, как ваш вопрос структурирован, никто не может сказать, правильно ли ваша программа делает правильные или неправильные вещи, потому что ничего не указано ни в комментариях кода, ни в поставленном вопросе.

...