2

マルチスレッドの概念を使用して、Java で交通信号を実装しようとしています。同期を使用したい。これは私が書いたコードですが、私の期待どおりに動作しません:P .. 私が実際に行っているのは、特定の時間にどのライトをオンにするかを決定する変数「a」を取得することです。例: a==0 は赤い光を与えるはずです。その後、赤い光は "a" のロックを取得し、一定の間隔の後に値を a==1 に変更し、オレンジ色の光に切り替えます。緑色の光についても同じことが起こります。良い ..

コード:

    package test;

class Lights implements Runnable {

    int a=0,i,j=25;
    synchronized public void valueA()
    {
        a=a+1;
    }

    public void showLight()
    {
        System.out.println("The Light is "+ Thread.currentThread().getName());
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
            for(i=25;i>=0;i--)
            {
                while(j<=i&&j>=10&&a==0)
                {
                showLight();
            /*some code here that locks the value of "a" for thread 1   
                and keeps it until thread 1 unlocks it! */
                try {

                    Thread.sleep(1000);


                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                j--;
                }


            while(j<10&&j>=5&&a==1)
            {

                showLight();
                /*some code here that locks the value of "a" for thread 1   
                and keeps it until thread 1 unlocks it! */
                try {
                    Thread.sleep(500);

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                j--;
            }


            while(j<5&&j>=0&&a==2)
            {
                showLight();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
            }
    }
}

メインクラス:

package test;

public class MainTraffic {
public static void main(String args[])
{
    Runnable lights=new Lights();

    Thread one=new Thread(lights);
    Thread two=new Thread(lights);
    Thread three=new Thread(lights);

    one.setName("red");
    two.setName("orange");
    three.setName("green");

    one.start();
    two.start();
    three.start();


}
}
4

1 に答える 1

1

クラスの複数の異なるインスタンスがある場合、synchronized(this) はあまり役に立ちません。同じオブジェクトで同期されているブロックのみが並列実行されません。

1 つのオプションは、使用したい "a" を含む共通オブジェクトを Lights コンストラクターに渡し、そのオブジェクトでスレッドを同期させることです。

于 2012-12-23T17:17:17.527 に答える