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
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


0