【问题标题】:How to get updated variable from my Thread countdown time class如何从我的线程倒计时时间类中获取更新的变量
【发布时间】:2014-04-20 18:23:59
【问题描述】:

嗨,我一直在尝试为我的 libgdx 游戏制作一个简单的 10 秒倒计时计时器,但我一直遇到问题。我现在在实现可运行的单独类中运行倒数计时器。这个类工作得很好,它按计划倒计时,我在这个线程中运行了一个 system.out.println 来验证它是否工作。问题是在我的主游戏屏幕中打印/绘制此计时器变量。

如果我尝试从我的游戏屏幕上打印这个变量,我会得到它的起始变量,即十,而不是不断更新的一个(从十开始倒数)。我什至使用了 getter 方法,但仍然没有运气。任何想法如何实现这一目标?谢谢

我假设这是因为线程与主游戏并行运行?

public class timekeep implements Runnable {
public Boolean TimerRunning=true;
private int Timer = 10; //need to print this from my main game screen as it changes

    public void run() {
    while(TimerRunning == true) {
            System.out.println("Time left "+ Timer);//works perfectly prints countdown
            //run code 
            //subtracts 1 from Timer every second
        }
    }

    public int gettime(){
        return Timer;//returns timer
    }
}
....

//accessing Timer variable from main game
System.out.println(Timekeep.gettime());//prints 10 all the time in the main screen 

【问题讨论】:

  • 你的例子很不完整。我们看不到 TimeKeep.gettime 方法。我也没有看到 Timer 被改变的任何地方。所以它没有改变也就不足为奇了。
  • 我认为没有必要发布我的整个线程类,我想让我的代码尽可能简单和相关。我的线程类工作只是因为我无法从我的主游戏中访问不断更新的变量 Timer。它总是从那里输出 10。当线程运行时,它每秒从 Timer 中减去 1,我发现这在我的 Thread system.out.println 中运行良好,但不是我的主游戏。
  • 大概你只有一个类 timeKeep 的对象,你用它来初始化一个新线程,然后启动它。您的课程不是线程安全的。我建议您将TimerRunningTimer 声明为volatile 或通过同步保护它们。这可能无法解决您的问题,但确保您的课程线程安全不会有什么坏处。
  • 谢谢,我去看看
  • 我将 TimerRunning 和 Timer 变量设置为 volatile,但仍然没有运气。

标签: java android multithreading libgdx


【解决方案1】:

您的代码执行了两个new timekeep() 表达式,因此创建了两个对象。您需要重新编码,以便只创建一个 timekeep 对象。例如

timekeep theTimeKeeper = new timekeep() ;
Thread t1 = new Thread(theTimeKeeper));
t1.start() ;
... 
System.out.println(theTimeKeeper.gettime());

【讨论】:

  • 感谢您的帮助。但是现在当我这样做时,线程不会运行。任何想法为什么它停止运行?
  • 没有看到类的代码很难说。鉴于我们可以看到的代码,以下是可能性:(a) TimerRunning 以某种方式设置为 false,(b) 存在来自 runreturn,(c) 抛出异常run, (d) 表示线程被中断`.
  • Ok 线程刚刚开始自己​​工作。也许只需要在 Eclipse 中刷新。我现在要测试它是否现在可以打印最新的 Timer 变量。谢谢你的帮助。
  • 当我尝试在 timekeep 类中获取 Timer 变量时,它再次不起作用。当我做 System.out.println(Timekeep.Timer); 时它不喜欢它或 System.out.println(Timekeep.gettime);它只是崩溃。我在上面发布了我的 gettime 方法,它看起来不对吗?
  • 不,您的 gettime 方法很好。我怀疑崩溃与您显示的代码无关。通常,当 Java 程序崩溃时,会出现异常和堆栈跟踪。从那些开始弄清楚发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2014-10-19
  • 1970-01-01
相关资源
最近更新 更多