在Java中使用线程异步传递数据

时间:2016-02-04 21:41:01

标签: java multithreading asynchronous

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

下面是一些示例代码,说明了我尝试做的事情。     package test.project;

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。

2 个答案:

答案 0 :(得分:0)

您可以在java中使用BlockingQueue更好地尝试。它允许在线程之间共享信息。 Blocking Queue Example 在stackoverflow中发布的其他解决方案中的红色指导您,并附加链接。 Stackoverflow suggestion for

答案 1 :(得分:0)

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

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);
    }
}