Java - Semaphore. Ejecución secuencial de threads.

   
Vista:

Semaphore. Ejecución secuencial de threads.

Publicado por Alberto (9 intervenciones) el 11/03/2017 21:17:14
Hola.
Quiero hacer una simulación donde tengo varios hilos y pretendo que se ejecuten en secuencia empleando un único semáforo. Para ello identifico cada hilo con un id y para que puedan realizar su trabajo, solicitan al semáforo tantos permisos como indique su id. Cuando un hilo finaliza, libera tantos recursos como su indique su id +1. De esta forma, el siguiente hilo en secuencia podrá comenzar a trabajar.

El problema es que no siempre funciona ya que, de vez en cuando, se bloquea.

Muchas gracias por la ayuda


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package pruebasecuencia;
 
import java.util.concurrent.Semaphore;
 
public class PruebaSecuencia {
    Semaphore sem = new Semaphore(0);
 
    public void go() throws InterruptedException{
        final int N = 5;
 
        Proceso[] proc = new Proceso[N];
 
        for (int i = 0; i < proc.length; i++) {
            proc[i] = new Proceso(i, sem);
            proc[i].start();
        }
 
        for (int i = 0; i < proc.length; i++) {
            proc[i].join();
        }
        System.out.println("Simulación finalizada");
    }
 
    public static void main(String[] args) throws InterruptedException {
        new PruebaSecuencia().go();
    }
}
 
 
public class Proceso extends Thread{
    Semaphore sem;
    int id;
 
    public Proceso (int id, Semaphore sem){
        this.id = id;
        this.sem = sem;
    }
 
    @Override
    public void run(){
        try {
            sem.acquire(id);
            System.out.println("Proceso " + id + " en ejecución");
            sleep (300);
            sem.release(id+1);
        } catch (InterruptedException ex) {
            Logger.getLogger(Proceso.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder