2011-10-31 35 views
0

セマフォを使ってJavaのダイニング哲学者の問題を解決する必要があります。セマフォーは、「手作業で」行われ、セマフォー・クラスを作成します。そして、次のようになります。どのようにセマフォを使用してJavaで食事哲学者をコーディングするのですか?

package principal; 
public class Semaforo { 
private int valor; 
private int esperando; 
public Semaforo(int valor) { 
    this.valor=valor; 
    this.esperando=0; 
} 
public synchronized void down() { 
    if (this.valor >0){ 
     this.valor--; 
    } else { 
     this.esperando++; 
     try { 
      wait(); 
     } catch (Exception e) { 

     } 
    } 
} 
public int getValor() { 
    return valor; 
} 
public synchronized void up() { 
    if (this.valor > 0) { 
     this.valor++; 
    } else { 
     if (this.esperando >0) { 
      notify(); 
      this.esperando--; 
     } else { 
      this.valor++; 
     } 
    } 
} 
} 

私は上のデッドロック、飢餓、ライブロックなどを同時実行の問題を回避解決策を持っていた場合、私はいいだろう。私は自分の時間に各哲学者が食べることを考えましたが、どのようにセマフォを使ってそれを達成できるのか分かりません。どのように私はJavaのセマフォーで食べる哲学者の問題を解決するのですか?

何か助けていただければ幸いです。

+0

いくつかのソリューションだけでなく、上で概説commong落とし穴[ウィキペディア](http://en.wikipedia.org/wiki/Dining_philosophers_problem#Solutions)があります。 – Nico

+0

はい、これらの解決策はセマフォーには関係ありません。 – Victor

+0

ソリューション "導体"はセマフォの概念を持っていることがわかりましたが、どのようにコード化するのか分かりません。 – Victor

答えて

1

This(64ページ)は、Tanenbaum's 現代オペレーティングシステム3eから取られた食事哲学者の問題になります。この問題は、Cプログラミング言語のセンパホールで解決されています。

+0

エラー404 - このリンクは無効です –

+0

URLが修正されました。 – blackcompe

0

esparantoフィールドは不要で、利用可能なセマフォの数を増やす()の度に 'valor'の状態を確認する必要はありません。私はあなたのコードを整えたので、私は仕事で退屈:

private class Semaforo { 
    private int valor; 

    public Semaforo(int valor) { 
     this.valor=valor; 
    } 

    public int getValor() { 
     return valor; 
    } 

    public synchronized void down() { 
     if (this.valor >0){ 
      this.valor--; 
     } else { 
      try { 
       wait(); 
      } catch (InterruptedException e) {} 
     } 
    } 

    public synchronized void up() { 
     this.valor++; 
     notify(); 
    } 
} 
関連する問題