スレッド間で通信する方法はいくつかあります。最も一般的なアプローチを使用すると、インスタンス変数を使用してスレッド間で情報を共有できますが、1つのスレッドからのみ書き込むか、共有変数への更新を同期するように注意する必要があります。または、スレッド間通信用に設計されたパイプ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つのポイントが一致するか同じであるかを判断する抽出されたメソッドがあります。