Programare concurentă - fire de execuție (Threads): Diferență între versiuni

De la WikiLabs
(Pagină nouă: Limbajul Java suportă nativ noțiunea de fir de execuție ([http://en.wikipedia.org/wiki/Thread_(computing) thread]), adică mai multe clase ce rulează în paralel, dar care fac par...)
 
Linia 30: Linia 30:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Acesta este apelul obișnuit al metodei ''run()''. Programul va afișa întâi de 10 ori textul pentru threadu-ul 1, apoi de 10 ori pentru threadul 2, apoi pentru threadu-ul 3, etc:
+
Acesta este apelul obișnuit al metodei ''run()''. Programul va afișa întâi de 5 ori textul pentru threadu-ul 1, apoi de 5 ori pentru threadul 2, apoi pentru threadu-ul 3, etc:
  
 
<syntaxhighlight lang="java">
 
<syntaxhighlight lang="java">

Versiunea de la data 24 august 2012 11:05

Limbajul Java suportă nativ noțiunea de fir de execuție (thread), adică mai multe clase ce rulează în paralel, dar care fac parte din aceeași aplicație. Un exemplu concret ar fi un server care acceptă și administrează mai multe conexiuni în același timp. Există două moduri de implementare al unui fir de execuție:

Clasa Thread ca și interfața Runnable definesc o metodă numită run(). Această metodă este metoda de start pentru thread-ul nou, analog metodei public static void main(String[]) pentru thread-ul principal. Această metodă run() poate fi apelată în două moduri:

  • apelând direct metoda run(), în care caz execuția se face ca un apel obișnuit de metodă;
  • apelând metoda start(), care pornește un thread nou care va începe execuția cu metoda run().
public class PrintThread extends Thread{

    private int index;

public PrintThread(int _index){
    index = _index;
}

public void run(){
    for(int i=0; i<10; i++){
        System.out.println("This is thread " + index);
        try{
            //pause for 1 second (1000 ms)
            Thread.sleep(1000);
        }catch(InterruptedException _ie){
            System.out.println(_ie.getMessage());
        }
    }
}

}

Acesta este apelul obișnuit al metodei run(). Programul va afișa întâi de 5 ori textul pentru threadu-ul 1, apoi de 5 ori pentru threadul 2, apoi pentru threadu-ul 3, etc:

public class NormalStarter{

public static void main(String[] _args){
    for(int i=0; i<5; i++){
        PrintThread _thread = new PrintThread(i + 1);
        _thread.run();
    }
}

}


Acesta este apelul metodei run() ca thread nou. Programul va afișa în același timp textele de la toate thread-urile:

public class ThreadStarter{

public static void main(String[] _args){
    for(int i=0; i<5; i++){
        PrintThread _thread = new PrintThread(i + 1);
        _thread.start();
    }
}

}

Sincronizarea thread-urilor (semaforul)