Java中线程之间异步传递数据
我正在从事一个项目,需要在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) {
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()”)在main函数和onresponse函数中,code>包含两个不同的线程。为了能够更新在主线程中运行的UI,我需要将数据返回到主线程。有什么建议吗?是的,id是不同的,但数据可用于主线程。例如,假设您在TestProject
中有一个私有字段。您可以从onResponse
更新它。例如,您有一个数字数组列表,您可以从onResponse
将response
添加到该列表中。我可以成功地将其添加到变量中,但是否有方法将其添加到stage而无需用户进一步操作?例如,我可以添加到numbers
数组中,但如果我尝试创建一个标签并将其添加到stage
(一个JavaFX组,它不起作用)stage.getChildren().add(标签)
。我在舞台上有一个按钮,如果我点击它,我可以呈现数字阵列中的内容。你能用你正在谈论的代码更新你的问题吗?我的回答表明了你最初的问题。