2017-03-12 3 views
0

Ich möchte einige Threads in einer Sequenz mit Semaphoren ausführen. Es gibt kein Problem mit einem Semaphor für jeden Thread, aber ich würde es gerne mit nur einem verwenden.Ausführen von Threads in einer Sequenz mit Semaphoren

Ich denke, dass der folgende Code gut funktionieren sollte, aber manchmal nicht. Ich würde deine Hilfe schätzen.

package pruebasecuencia; 

import java.util.concurrent.Semaphore; 

public class PruebaSecuencia { 
    Semaphore sem = new Semaphore(0); 

    public void go() throws InterruptedException{ 
     final int N = 5; 

     Process[] proc = new Process[N]; 

     for (int i = 0; i < proc.length; i++) { 
      proc[i] = new Process(i, sem); 
      proc[i].start(); 
     } 

     for (int i = 0; i < proc.length; i++) { 
      proc[i].join(); 
     } 
     System.out.println("Ended simulation"); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     new PruebaSecuencia().go(); 
    } 
} 


public class Process extends Thread{ 
    Semaphore sem; 
    int id; 

    public Process (int id, Semaphore sem){ 
     this.id = id; 
     this.sem = sem; 
    } 

    @Override 
    public void run(){ 
     try { 
      sem.acquire(id); 
      System.out.println("Process " + id + " executing"); 
      sleep (300); 
      sem.release(id+1); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Proceso.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

}

+3

Worauf kommt es an, Threads nacheinander auszuführen? –

+0

Angenommen, einer der Prozesse/Threads hat eine ID von 1. Jedes Mal, wenn ein Semaphor mit einer Anzahl> 1 freigegeben wird, könnte der Prozess/Thread, der einen sem.acquire (1) ausführt, den Semaphor trotz eines anderen erhalten ausstehend erwirbt. Sie haben wahrscheinlich einen Semaphor pro Prozess/Thread verwendet. – rcgldr

+0

Ich habe kein Problem mit einem Semaphor pro Prozess, aber ich würde gerne wissen, warum dieser Code nicht funktioniert. In einigen Ausführungen funktioniert es gut, aber manchmal hängt die Anwendung. – Alberto

Antwort

0

this answer sehen, dass erklärt, warum es fehlschlagen kann, beispielsweise wenn es nur drei Genehmigungen zur Verfügung und der Faden vier Genehmigungen erfordert, ist die nächste zugewiesen erlaubt sein. Darüber hinaus werden verschiedene Möglichkeiten für dieses Problem erläutert.

Verwandte Themen