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时......
答案 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同时访问该变量。这也可以防止意外值出现问题。特别是,当多个线程写变量时。