-1
public class Loader implements Runnable{
    int players;
    public static void main(String[] args){
        Loader Loader = new Loader();
        Loader.initiate();
    }
    public void initiate(){
        Thread t1 = new Thread(new Loader());
        t1.start();

        while(true){
            players++;
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public void run() {
        while(true){
            System.out.println(players);
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

そのため、スレッド ブロードキャスターをアクティブにしてプレーヤーの数をブロードキャストすると、プレーヤーの int 値に追加してブロードキャストすることはできません...

プレーヤーがログオンしたときのプレーヤー = 0 --> プレーヤー++; しかし、プレーヤーの数をブロードキャストすると、まだ0です...

4

1 に答える 1

3

クラスの 2 つのインスタンスを作成しますLoader。あなたが実行します

players++;

あるインスタンスでは、他のインスタンスでも更新されることを期待しています...

交換

Thread t1 = new Thread(new Loader());

Thread t1 = new Thread(this);

そして、それはよりうまくいくかもしれません...(しかし、他にもいくつかの問題があると思います)

編集Peter Lawreyがコメントしたように、あなたの例の状況playersでは宣言する必要がありますvolatile

volatile int players;

両方のスレッドが変数を使用しています。コンパイラ/Java VM はこれを認識せず、その結果をキャッシュする可能性があり、その結果がplayers実際の値と期待される値を混乱させる可能性があります (どのスレッドにあるかによって異なります)。変数を揮発性として宣言すると、変数がplayersキャッシュされず、必要に応じてその値がメモリから取得されます。

追加:synchronize同時に 1 つのスレッドのみが変数にアクセスしていることを確認するために使用することができます。これにより、予期しない値の問題も回避できます。特に、複数のスレッドが変数を書き込んでいる場合。

于 2013-01-13T19:36:57.910 に答える