-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

您创建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它来确保只有一个线程同时访问该变量。这也可以防止出现意外值的问题。特别是当多个线程正在写入变量时。

于 2013-01-13T19:36:57.910 回答