[英]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.