Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Параллелизм для чайников


Автор: Fieral 8.4.2008, 19:59
Может кто-нибудь привести пример кода где есть 2 процесса p1 и р2 и две переменных v1 и v2.
Один процесс переписвает значение первой переменной во вторую, а второй значение второй переменной в первую. 

И ещё, если можно, пример где они не ругаются по поводу совместного доступа.

Автор: Kangaroo 8.4.2008, 20:11
Fieral, почитайте http://forum.vingrad.ru/faq/topic-157915.html

Автор: mbasil 8.4.2008, 20:49
Код

 class Runner1 implements Runnable {
  private MainClass mc;
  public Runner1( MainClass p_mc ) {
        mc = p_mc;
  }  
  public void run() {
   int i = 1;
   while ( i < 10 ) {
            printANDset( i );
            try {
                   Thread.sleep(1000);
             } catch ( InterruptedException e ) {
                 // sleep interrupted
             }
       i++;
    }
  }
  private void printANDset( int i ) {
    synchronized( mc ) {
       System.out.println("var1= " + mc.getVar1() );
       mc.changeVar2( i * 10 );
     }
  } 
 }
 class Runner2 implements Runnable {
  private MainClass mc;
  public Runner2( MainClass p_mc ) {
        mc = p_mc;
  }  
  public void run() {
   int i = 1;
   while ( i < 10 ) {
           printANDset( i );
           try {
                 Thread.sleep(1000);
            } catch ( InterruptedException e ) {
               // sleep interrupted
            }
      i++;
   }
  }
  private void printANDset( int i ) {
    synchronized( mc ) {
       System.out.println("----------- var2= " + mc.getVar2() );
       mc.changeVar1( i );
     }
  } 
 }
 public class MainClass { 
   private int var1 = 0;
   private int var2 = 0;
 public static void main(String args[]) {
   MainClass m = new MainClass();
   Runner1 r1 = new Runner1( m );
   Runner2 r2 = new Runner2( m );
   Thread t1 = new Thread( r1 );
   t1.start();
   Thread t2 = new Thread( r2 );
   t2.start();
 }
 public int getVar1() {
       return var1;
 } 
 public void changeVar1( int p_var1) {
       var1 += p_var1;
 } 
 public int getVar2() {
       return var2;
 } 
 public void changeVar2( int p_var2) {
       var2 += p_var2;
 } 
}

Автор: Fieral 9.4.2008, 21:41
не совсем понял про синхронизацию,

вот например есть такая программа:
http://ipicture.ru/

где каждый процесс выполняет:
Код

...
boolean флаг
...

public void run() {
    
        for(;;){


            while( флаг_справа == true ){ 

                
            }
            
            флаг_слева = false;

            while( флаг_слева == false ){
                
            }
            
            Execute();

            флаг_справа=true;
            
        
        }
        

        
    }




1) Требуется ли здесь синхронизация?
2) Бесконечное вращение пустых while наверняка бесцельно ест процессор - как это исправить?

Автор: Fieral 13.4.2008, 02:49
Всё. Спасибо. Допёр. smile

Автор: bilbobagginz 13.4.2008, 03:28
ребят, насколько я понимаю в Java чайник трудно найти, поэтому рекомендую назвать сабж "для кофейников".


Автор: Samotnik 13.4.2008, 03:42
Цитата(bilbobagginz @  13.4.2008,  03:28 Найти цитируемый пост)
ребят, насколько я понимаю в Java чайник трудно найти, поэтому рекомендую назвать сабж "для кофейников".

Боюсь, что таких тем придется  сотни создавать! 
Это ж основы, и прочитать их можно в любой литературе по  Java.  Кому нужно тот откроет (либо скачает)  книдку  по  java  и прочитает интересующий его вопрос, а если чего - нить не понял, то сюда !    на форум ! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)