0

セマフォの使用方法を示す小さなプログラムを作成しようとしています。Farmer の 2 つのインスタンスを実行する 2 つのスレッドを作成します。1 つのスレッドの後に 2 番目のスレッドが終了する代わりに、両方が同時に終了するように見えます (出力で示されているように:

農夫は橋を渡り、北に向かっています 農夫は橋を渡り、
南に向かっています
農夫は橋を渡り、現在北に向かっています
農夫は橋を渡り、現在南に向かっています

ここで私が間違っていることを誰かに教えてもらえますか?

import java.util.concurrent.Semaphore;
public class Farmer implements Runnable
{
    private String heading;
    private final Semaphore bridge = new Semaphore(1);
    public Farmer(String heading)
    {
        this.heading = heading;
    }

    public void run() 
    {
        if (heading == "north")
        {
            try 
            {
                //Check if the bridge is empty
                bridge.acquire();
                System.out.println("Farmer going over the bridge, heading north");
                Thread.sleep(1000);
                System.out.println("Farmer has crossed the bridge and is now heading north");
                bridge.release();
            } 
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
            //Farmer crossed the bridge and "releases" it

        }
        else if (heading == "south")
        {
            try 
            {
                //Check if the bridge is empty
                bridge.acquire();
                System.out.println("Farmer going over the bridge, heading south");
                Thread.sleep(1000);
                //Farmer crossed the bridge and "releases" it
                System.out.println("Farmer has crossed the bridge and is now heading south");
                bridge.release();
            } 
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
        }
    }
}
4

1 に答える 1

5

各 Farmer は独自のセマフォを作成しています。つまり、他とは独立してセマフォを取得および解放できます。

これを変える:

private final Semaphore bridge = new Semaphore(1);

これに:

private final static Semaphore bridge = new Semaphore(1);

その後、セマフォはすべての Farmer インスタンス間で共有されます。

于 2012-09-30T15:31:46.407 に答える