【问题标题】:How to pass variables to different Threads in Java如何将变量传递给Java中的不同线程
【发布时间】:2020-09-22 05:08:33
【问题描述】:

我正在制作一个从 API 获取实时价格信息的程序。然后我想在实时更新的 JavaFX 图表上显示价格信息。当我尝试将信息传递给 JavaFX 线程时,它并不总是正确传递,JavaFX 线程也无法获取价格信息。

API 调用在单独的线程上完成,当它获得信息后,它会调用 updateScene 方法。这是我遇到问题的地方,API 线程包含我尝试设置的变量以供 JavaFX 线程使用的所有信息,但它没有任何信息。


private CandleStickFeed candleStickFeed;

public void updateScene(CandleStickFeed candleStickFeed){

    this.candleStickFeed = candleStickFeed;

    System.out.println("Feed Size This Thread = " + candleStickFeed.getSize());

    Platform.runLater(new Runnable(){
        
        @Override
        public void run(){
            
            System.out.println("Feed Size JavaFX Thread = " + candleStickFeed.getSize());
            updateChart();
        }
    });
}

程序有时会输出

此线程的饲料大小 = 5

提要大小 JavaFX 线程 = 5

这是我所期望的。但它有时也会输出

此线程的饲料大小 = 5

提要大小 JavaFX 线程 = 0

任何帮助将不胜感激。我是使用多个线程的新手,所以不确定我在做什么。我一直在寻找不同的答案,但找不到任何答案。谢谢

【问题讨论】:

    标签: java multithreading javafx


    【解决方案1】:

    这是对@Simon 答案的补充。

    您的问题不在于“传递变量”。您的 runLater(...) 任务显然正在获取变量的值。问题是该值是对一个可变对象的引用,并且该对象有时会在创建任务的时间和任务的时间之间被修改执行。

    Simon 的建议归结为:为新任务提供它自己的私有副本,该副本将需要来自 CandleStickFeed 实例的任何信息,并让它专门从该私有副本中工作。

    【讨论】:

    • 感谢您的额外解释非常有帮助
    【解决方案2】:

    尝试从candleStickFeed 中提取相关信息,并将该结构传递给 Runnable 子类。

    public void updateScene(CandleStickFeed candleStickFeed) {
        CandleStickData data = new CandleStickData(candleStickFeed);
        Platform.runLater(new ChartUpdateRunnable (data));
    }
    
    private class CandleStickData {
        private double[] numbers; // or whatever you need
        CandleStickData (CandleStickFeed candleStickFeed) {
            this.numbers = new double[candleStickFeed.getSize()];
            // TODO: populate the data structure
        }
    }
    
    private ChartUpdateRunnable implements Runnable {
        private CandleStickData data;
        ChartUpdateRunnable(CandleStickData data) {
            this.data = data;
        }
        @Override
        public void run(){
            System.out.println("Feed Size JavaFX Thread = " + data);
            updateChart();
        }
    } 
    

    原则是不传递可能经常更改状态的提要类,而是提取一个不可变的状态对象,并将其传递给可运行的类实例进行更新。

    【讨论】:

    • 谢谢,这对我有很大帮助,让我的程序正常运行
    猜你喜欢
    • 2015-05-05
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2017-03-20
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多