Java中线程间的异步通信

Java中线程间的异步通信,java,multithreading,Java,Multithreading,后台: 我在安卓系统开发方面进行实践。 正在尝试创建一个从远程http服务器获取一些数据的应用程序。 Android系统要求http请求在单独的线程中完成 所以,我有一个主线程,其中发生了一些UI交互,第二个线程实现了可运行接口,它发出http请求。 第二个线程中有两种可能的场景: 一切正常,我得到了一个有效的答复 发生了一些错误,我想通知我的主线程 因此,问题是: 线程之间异步通信的最佳实践是什么? 我不能暂停睡眠,等待我的主线程,因为用户应该能够与UI交互 谢谢 UPD: 重要的是,Andr

后台: 我在安卓系统开发方面进行实践。 正在尝试创建一个从远程http服务器获取一些数据的应用程序。 Android系统要求http请求在单独的线程中完成

所以,我有一个主线程,其中发生了一些UI交互,第二个线程实现了可运行接口,它发出http请求。 第二个线程中有两种可能的场景:

一切正常,我得到了一个有效的答复 发生了一些错误,我想通知我的主线程 因此,问题是: 线程之间异步通信的最佳实践是什么? 我不能暂停睡眠,等待我的主线程,因为用户应该能够与UI交互

谢谢

UPD: 重要的是,Android只是一个测试的地方。
我希望使用本机Java库/类来实现这个结果。…

有很多方法可以做到这一点。我在主要活动中通常是这样做的:

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();
        }
    });
}
此示例仅通知用户,但您可以添加或更改运行的内容。 编辑 据介绍,这是一种在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调用集合并通知线程B一些事件 -线程循环中的踏板B调用get以检查是否满足所需的条件,并做出相应的反应。请注意,线程B可能使用的不是线程循环,而是任何其他循环、计时器等。 编辑3 您还可以向UI线程发送消息,如或中所述
另外,HTTP请求呢?如果您不仅要将HTTP请求,而且还要将所有相关工作转移到非UI线程中,那么我很乐意使用SyncHttpClient或其对应的SyncHttpClient。此库处理线程和http通信处理方面的许多问题

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


同时,当主线程工作时,您会向用户展示一个祝酒词,说明正在获取HTTP信息。

如果主线程继续运行,只需向runnable添加一个状态,您可以随时扫描该状态?观察者模式?nablex,你的意思是我应该使用计时器定期检查一些状态吗?我不能停止我的主线程,因为正如我所写的,用户应该始终能够与UI.1交互,这不会持续很长时间。用户可能感觉不到响应延迟。第二,这种显示toast的方法在Android编程中几乎被用作获取资源的标准,所以不用担心,这不是确切的时间问题。UI线程永远不应该停止。我在关于Android的问题中添加了一个更新。谢谢。你能解释一下什么是runOnUiThread方法吗?好的,我认为这是你自己的函数。我现在找到了。我已经更新了这个问题,所以你能给我一些建议吗?据我所知,如果同步方法试图访问这个方法,而另一个线程也在访问它,那么它可以停止线程。但我的主线决不能停顿。另外:我如何理解主线程应该调用这个方法?计时器?您的线程将停止几微秒以设置单个int或boolean,而您对此无能为力。另请参见edit3:由于您提到了Android,请仔细查看runOnUiThread,这是系统为您提供的非常方便的方法