我正在开发一个项目,我需要在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。
答案 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);
}
}