有幾種方法可以在線程之間進行通信。使用最常用的方法,您可以使用實例變量在線程之間共享信息,但必須注意只能從一個線程寫入或將任何更新同步到共享變量。或者,您可以使用專爲線程間通信而設計的管道I/O流,或者在線程之間傳遞原始數據。一個線程將信息寫入流中,另一個線程讀取信息。
下面是一個示例方法,它將讀取慢速網絡連接的輸出並使用線程將其轉儲到System.out。
public void threads() throws IOException {
final PipedOutputStream outputForMainThread = new PipedOutputStream();
new Thread(new Runnable() {
@Override
public void run() {
while(moreDataOnNetwork()) {
byte[] data = readDataFromNetwork();
try {
outputForMainThread.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
BufferedReader reader = new BufferedReader(new InputStreamReader(new PipedInputStream(outputForMainThread)));
for(String eachLine = reader.readLine(); eachLine != null; eachLine = reader.readLine()) {
System.out.println(eachLine);
}
}
但是它幾乎聽起來像你想去的地方時,其他線程檢測到某個條件一個線程(用戶界面線程)通知事件回調機制。根據你的平臺,大部分內容都被烘焙了。使用Android,例如,你可以有一個線程來確定一個網格實體的移動。它會向主用戶界面線程發送更新以重新繪製屏幕。這樣的更新可能類似於:
public void gridEntityDidUpdate(final Point fromLocation, final Point toLocation) {
Activity activity = getMainActivity();
activity.runOnUiThread(
new Runnable() {
@Override
public void run() {
updateScreen(fromLocation, toLocation);
if(pointsAreCoincedent(fromLocation, toLocation)) {
System.out.println("Hello there!");
}
}
}
);
}
private void updateScreen(Point fromLocation, Point toLocation) {
//Update the main activity screen here
}
在這種情況下,你有一個後臺線程的作品了屏幕上的所有元素的位置,並通知當元素位置改變主線程。有一種提取的方法確定2點是否是巧合的或相同的。
很好的回答!然而,我的問題更多的是,我怎麼能得到兩個屏幕上的元素互相溝通,而不是讓他們與用戶界面溝通。 :)我也沒有使用這個項目的GUI,但我理解你的例子的重點。 – asteri
也許可以解釋你當前的代碼。你使用了多少個線程?每個線程負責什麼?這聽起來像你有2個線程,每個線程控制一個單獨的屏幕元素,在這種情況下,你可能會得到一些像每個元素的Point成員變量一樣快/髒的東西。在任一線程執行一個動作之前,它可以檢查另一個線程的成員變量並作出相應的響應。 – Cliff