而loop int值不会更新

时间:2013-01-13 19:33:05

标签: java multithreading while-loop int

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时......

1 个答案:

答案 0 :(得分:3)

您创建了Loader类的两个实例。你执行

players++;

在一个实例中,并期望它在另一个实例中更新......

替换

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

Thread t1 = new Thread(this);

并且可能工作得更好......(但我怀疑还有一些其他问题)

修改:正如Peter Lawrey所评论,在您的示例情况players需要声明volatile

volatile int players;

两个线程都在使用变量,编译器/ Java VM不知道这一点,并且可能会缓存players的结果,这可能会/将会混淆实际值和期望值(取决于你在哪个线程中)。将变量声明为volatile,确保不缓存players,并在需要时从内存中获取其值。

附加:您可能希望使用synchronize来确保只有一个Thread同时访问该变量。这也可以防止意外值出现问题。特别是,当多个线程变量时。