Java中如何将变量传递给不同的线程

Jor*_*ter 0 java multithreading javafx

我正在制作一个从 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();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

程序有时会输出

进给尺寸 此线程 = 5

馈送大小 JavaFX 线程 = 5

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

进给尺寸 此线程 = 5

馈送大小 JavaFX 线程 = 0

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

Sim*_*mon 6

尝试从 中提取相关信息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();
    }
} 
Run Code Online (Sandbox Code Playgroud)

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