【问题标题】:How to change variables in the main thread from another thread?如何从另一个线程更改主线程中的变量?
【发布时间】:2015-12-08 17:52:45
【问题描述】:

这是我的 run() 函数:

@Override
public void run() {
    while (true) {
        long elapsed = TimeUtils.nanoTime() - startTime;
        Texture currentFrame = connectedAnim.getFrame(elapsed);
        textureToApplyTo = currentFrame;
    }
}

在这个类的构造函数中,我在主线程中将textureToApplyTo 设置为一个Texture 变量。问题是,当我在 run() 函数中将 textureToApplyTo 设置为 currentFrame 时,它只会在我设置它的类中更改它。我认为问题是我在这个变量中创建了变量 textureToApplyTo类,以及主类,但我不知道我该怎么做......我需要一种方法来从这个线程更改主类中的textureToApplyTo 变量。

【问题讨论】:

  • 你能提供更多代码吗?可以使用回调吗?
  • 我认为您的问题可能出在其他地方。除非您在线程中创建一个单独的 textureToApplyTo 实例,看起来您并没有这样做,否则您的线程正在访问同一个实例。在线程之间共享变量非常容易,这就是为什么您必须为共享变量使用互斥锁。如果您发布更多代码可能会有所帮助。

标签: java multithreading variables libgdx


【解决方案1】:

在你的 textureToApplyTo 声明中添加 volatile 键。像这样

 public static volatile Texture textureToApplyTo;

【讨论】:

    【解决方案2】:

    你应该让这个变量成为一个全局变量,所以在声明这个类时,你会有这样的东西:

    public class yourClass
    {
        private textureToApplyTo;
    
        public setTexture(Frame frame)
        {
            textureToApplyTo = frame;
        }
    }
    

    完成此操作后,您可以在您拥有的 run() 方法中调用此方法。

    @Override
    public void run() {
        while (true) {
            long elapsed = TimeUtils.nanoTime() - startTime;
            Texture currentFrame = connectedAnim.getFrame(elapsed);
            yourClass.setTexture(currentFrame);
        }
    }
    

    【讨论】:

    • 必须定义为一个字段,因为textureToApplyTo 根本没有在run 方法中定义。
    • 他说他声明了两次,主要是在运行中。所以我说的仍然是一个有效的答案,如果他正在创建两个变量,这两个变量似乎都是局部的,那么他需要通过创建一个变量来解决它,一个全局变量。
    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2016-11-30
    • 2013-07-19
    相关资源
    最近更新 更多