Java中线程之间异步传递数据

Java中线程之间异步传递数据,java,multithreading,asynchronous,Java,Multithreading,Asynchronous,我正在从事一个项目,需要在Java线程之间异步传递数据,但找不到合适的解决方案。这需要实时发生,因为子线程可以永远运行 下面是一些示例代码,说明了我要做的事情。 包装测试项目 import java.util.Random; import java.util.Timer; import java.util.TimerTask; public class TestProject { public static void main(String[] args) {

我正在从事一个项目,需要在Java线程之间异步传递数据,但找不到合适的解决方案。这需要实时发生,因为子线程可以永远运行

下面是一些示例代码,说明了我要做的事情。 包装测试项目

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;



public class TestProject {

    public static void main(String[] args) {

        Thread thread = new Thread(new Generator());
        thread.start();

    }

}

class Generator implements Runnable {

    @Override
    public void run() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask(){

            @Override
            public void run() {
                Random r = new Random();

                // I need to get this back to the main thread to update the UI
                System.out.println(r.nextInt(50000));
            }

        }, 200, 200);
    }

}
以上代码仅用于说明目的。我试图解决的实际问题是在后台线程中有两个数据流,一旦数据进入,我需要将其传递回主线程以更新UI


这是JavaFX项目,不是Android。

在java中使用BlockingQueue可以更好地尝试。它允许在线程之间共享信息。
红色的另一个解决方案张贴在stackoverflow中,以指导您,并附加了该解决方案的链接

这将满足您的需求。它使用一个接口作为线程之间的消息总线

public class Driver {

    public static void main(String[] args) {
        Driver d = new Driver();
        d.run();
    }

    // on the main thread
    private ArrayList<Integer> numbers;

    void run() {
        numbers = new ArrayList<Integer>();
        System.out.println(numbers.size()); // 0

        Thread thread = new Thread(new Generator(new AsyncResponse<Integer>() {
            @Override
            public void onResponse(Integer response) {
                System.out.println(numbers.size());
                // asynchronously update a main thread variable
                numbers.add(response); 
            }
        }));
        thread.start();

        // Most likely will still be 0 because this is on main thread 
        System.out.println(numbers.size()); 
    }
}

interface AsyncResponse<T> {
    void onResponse(T response);
}

class Generator implements Runnable {

    AsyncResponse<Integer> delegate;
    Random r;

    public Generator(AsyncResponse delegate) {
        this.delegate = delegate;
        this.r = new Random();
    }

    @Override
    public void run() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                if (delegate != null) {
                    delegate.onResponse(r.nextInt(50000));
                }
            }

        }, 200, 200);
    }
}
公共类驱动程序{
公共静态void main(字符串[]args){
驱动程序d=新驱动程序();
d、 run();
}
//在主线上
私有数组列表数;
无效运行(){
数字=新的ArrayList();
System.out.println(numbers.size());//0
线程线程=新线程(新生成器(新异步响应)(){
@凌驾
公共void onResponse(整数响应){
System.out.println(number.size());
//异步更新主线程变量
数字。添加(响应);
}
}));
thread.start();
//最有可能仍然是0,因为这在主线程上
System.out.println(number.size());
}
}
接口异步响应{
无效反应(T反应);
}
类生成器实现可运行{
异步响应委托;
随机r;
公共生成器(异步响应委托){
this.delegate=委托;
this.r=新随机数();
}
@凌驾
公开募捐{
定时器=新定时器();
timer.schedule(新TimerTask(){
@凌驾
公开募捐{
如果(委托!=null){
代表onResponse(r.nextInt(50000));
}
}
}, 200, 200);
}
}

在谷歌上寻找并发生产者/消费者模式这篇文章可能会很有帮助:一旦你克服了学习曲线,RxJava是一个有趣的库。我正在研究生产者/消费者模式,但这似乎会将数据带回主线程。如果您将主线程作为使用者,它最终会阻止您的响应。但是,如果执行
System.out.println(“开始:“+Thread.currentThread().getId()”)包含两个不同的线程。为了能够更新在主线程中运行的UI,我需要将数据返回到主线程。有什么建议吗?是的,id是不同的,但数据可用于主线程。例如,假设您在
TestProject
中有一个私有字段。您可以从
onResponse
更新它。例如,您有一个数字数组列表,您可以从
onResponse
response
添加到该列表中。我可以成功地将其添加到变量中,但是否有方法将其添加到stage而无需用户进一步操作?例如,我可以添加到
numbers
数组中,但如果我尝试创建一个标签并将其添加到
stage
(一个JavaFX组,它不起作用)
stage.getChildren().add(标签)
。我在舞台上有一个按钮,如果我点击它,我可以呈现
数字
阵列中的内容。你能用你正在谈论的代码更新你的问题吗?我的回答表明了你最初的问题。