繁体   English   中英

Java中线程之间的异步通信

[英]Asynchronous communication between threads in Java

后台:我正在从事Android开发。
尝试制作一个从远程http服务器获取一些数据的应用程序。
Android系统要求http请求必须在单独的线程中完成。

因此,我有一个主线程,其中发生了一些UI交互,第二个线程(实现Runnable接口)发出了HTTP请求。 第二个线程中有两种可能的情况:

  • 一切正常,我得到了有效的回应
  • 发生了一些错误,我想通知我有关它的主线程

所以问题是:
在线程之间异步通信的最佳实践是什么?
我无法暂停(睡眠,等待)主线程,因为用户应该可以与UI进行交互。

谢谢

UPD
重要的是“ Android”只是测试的地方。
我想使用“本地” Java库/类/来实现结果。

有很多方法可以做到这一点。 我通常这样做(在MainActivity中):

public void notification(final int title, final int message, final int duration) {
    runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(MainActivity.this, message, duration).show();
        }
    });
}

此示例仅通知用户,但您可以添加或更改run()的内容。
编辑
根据runOnUiThread()上的文档,这是一种旨在在UI线程上运行代码段的方法。 这意味着您可以从任何线程安全地调用它。 您唯一需要考虑的就是在线程中拥有mainActivity引用。

编辑2
如果要使用纯Java进行操作,请使用同步方法安全地访问对象的内容,例如:

public class YourClassWithSychMethod {
    private int i;

    public synchronized void set(int val) {
        i=val;
    }

    public synchronized int get() {
        return i;
    }
}

这意味着您可以从任何线程调用这些方法。 它可能不是专门的课程,而是您的任何课程。
因此, 场景如下:
-线程A调用set() ,因此将某些事件通知线程B
-线程循环中的踩B调用get()来检查是否满足所需条件并做出相应反应。 请注意,线程B可以不使用线程循环,而可以使用任何其他循环,计时器等。
编辑3
您还可以将消息发送到您的UI线程,如docs中所述或例如此处

PS HTTP请求怎么样-我对AsyncHttpClient (或者与之对应的SyncHttpClient感到非常满意,如果您不仅需要将http请求,而且所有相关工作都移到非UI线程中)。 该库解决了线程和http通信处理方面的许多麻烦

在主线程中使用YourThread.join()。 这将停止主线程的工作,直到您从YourThread获得响应。 而且,您可以根据YourThread的响应来决定显示给用户/程序流的响应。

同时,在主线程工作时,您向用户展示祝酒词,指出正在获取HTTP信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM