2

こんにちは、ちょっとした問題があり、どこが間違っているのかわかりません。

Xを繰り返し印刷する2つのスレッドXと、Yを繰り返し印刷するYがあります。Y は X の後に出力する必要があります。

Semaphore クラス BinarySemaphore から派生しました。

public class BinarySemaphore extends Semaphore {

public BinarySemaphore(int initial){
    value = (initial>0) ? 1 : 0;
}

public synchronized void P() throws InterruptedException{
    while (value==0){
    wait();
    }
value = 0;
    notify();
}

public synchronized void V(){

    value = 1;
    notify();
}
}

Xスレッドクラス

public class xThread extends Thread implements Runnable{

private BinarySemaphore xSemaphore;
private BinarySemaphore ySemaphore;


public xThread(String myName, BinarySemaphore nSemaphoreX, BinarySemaphore nSemaphoreY ){
    super(myName);
    xSemaphore = nSemaphoreX;
    ySemaphore = nSemaphoreY;
}

public void run(){
    try{
    xSemaphore.P();
    System.out.println(getName());
    ySemaphore.V();
    }catch(InterruptedException E){
    System.out.println("Thread X was interrupted"); 
    }
}   
}

Yねじクラス

public class yThread extends Thread implements Runnable{

private BinarySemaphore xSemaphore;
private BinarySemaphore ySemaphore;


public yThread(String myName, BinarySemaphore nSemaphoreX, BinarySemaphore nSemaphoreY ){
    super(myName);
    xSemaphore = nSemaphoreX;
    ySemaphore = nSemaphoreY;
}

public void run(){
    try{
    ySemaphore.P();
    System.out.println(getName());
    xSemaphore.V();
    }catch(InterruptedException E){
    System.out.println("Thread Y was interrupted");
    }


}
}

これらのスレッドを10秒間実行すると、得られるのは

X Y

BUILD SUCCESSFUL (合計時間: 10 秒)

ここで何が欠けていますか? 10秒間交互に繰り返さないのはなぜですか?

4

1 に答える 1

0

これは、@reprogrammer が彼のコメントで提案したように、スレッドが一度だけ印刷されてから終了するためです。次のようなループを挿入する必要があります。

public void run(){
  while (needsToRun){
    try{
    xSemaphore.P();
    System.out.println(getName());
    ySemaphore.V();
    }catch(InterruptedException E){
    System.out.println("Thread X was interrupted"); 
    }
  }
}   
于 2012-11-28T18:43:52.857 に答える