2010-03-02 1 views
-3

может кто-нибудь сказать, будет ли код ниже работать нормально?подтверждающий программный поток

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(); 

} 
+1

Возможно, если вы правильно переформатируете/отредактируете код. Отступ является фиктивным, и это затрудняет интерпретацию кода. Если вы используете Eclipse, просто нажмите «Ctrl + Shift + F». Далее также подробно расскажите, какова фактическая проблема с кодом. Что происходит? Что не происходит? Как этого не хватает? SSCCE (http://sscce.org), который мы можем просто скопировать, не может быть прекрасным. – BalusC

+0

Вместо публикации огромного блока кода вы можете рассмотреть возможность размещения более конкретного вопроса о коде с соответствующими фрагментами. Или, по крайней мере, отформатировать его правильно; это действительно трудно читать без отступов. –

+0

Как я могу вам сказать, будет ли это работать, если вы не скажете мне, что он собирается делать? – Pops

ответ

2

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

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

+0

CriticalSection.freq [iFrequency] = true просто устанавливает логический массив из класса CriticalSection обратно в true. и Ive использовали stop(), чтобы убить текущий поток. Но да, я понимаю, что вы упомянули о синхронизированном блоке. Будет ли код ниже обеспечивать параллелизм? Ive опустил большую часть кода, меня беспокоит синхронизированный блок. int enterCritical() { \t int busy = 0; \t для (int i = 0; i

+1

@ user282544: Комментарии не имеют форматирования, вы должны действительно редактировать свой исходный пост, когда у вас есть такие изменения. Я укажу, однако, что stop() устарел и не имеет оснований: http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – Pops

+0

большое спасибо за ваш ответ. Спасибо также за то, что я довел до моего сведения идею редактирования моего оригинального сообщения с изменениями кода, мне это не приходило в голову –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^