Java中线程之间的异步通信

时间:2014-10-02 06:04:02

标签: java multithreading

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

所以,我有一个主线程,一些UI交互发生,第二个线程(实现Runnable接口),发出http请求。 第二个帖子中有两种可能的情况:

  • 一切顺利,我得到了有效回复
  • 发生了一些错误,我想通知我的主线程

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

由于

UPD
重要的是“Android”才是测试的地方 我想使用“本机”Java库/类/...

来实现结果

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。我通常这样做(在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()的内容。
修改
根据{{​​3}},它是一种用于在UI线程上运行代码片段的方法。这意味着您可以从任何线程安全地调用它。您唯一需要考虑的是 - 在您的线程中使用mainActivity引用。

EDIT2
如果您要在纯Java中执行此操作 - 请使用synchronized方法安全地访问对象的内容,例如:

public class YourClassWithSychMethod {
    private int i;

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

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

这意味着您可以从任何线程调用这些方法。它可能不是专门的课程,而是您的任何课程。
所以场景如下:
- 线程A调用set(),因此通知线程B关于某些事件
- 线程循环中的Tread B调用get()以检查是否满足所需条件并作出相应反应。注意,线程B可能不使用线程循环,而是使用任何其他循环,计时器等。
EDIT3
您也可以向您的UI主题发送消息,如docs on runOnUiThread()中所述,或者docs

PS HTTP请求怎么样 - 我对here(或其对应的SyncHttpClient非常满意,如果您不仅需要移动http请求而且全部相关工作到非UI线程)。这个库通过线程和http通信处理来解决很多麻烦

答案 1 :(得分:-1)

在主线程中使用YourThread.join()。这将阻止主线程的工作直到你从YourThread得到响应。您可以根据来自YourThread的响应决定向用户/程序流显示响应。

同时,当主线程正在工作时,您向用户显示一个Toast,声明正在获取HTTP信息。