首页  编辑  

Java中异步变同步的简单方法

Tags: /Android/   Date Created:
Java中,如果某些API或者接口,采用回调模式,但是你的代码又需要等待对应结果输出后进行处理,必须等待后继续处理,该如何做?
举个例子,如果你用一个线程去轮询接受Socket输入,然后其他地方发送Socket,必须等待服务器响应才能继续处理,怎么办?
正常情况下,如果你直接在Socket中写入后立刻读取,是没有问题的,但是比如OKHTTP,异步模式,怎么才能等服务器返回后再继续处理代码?
答案是 synchronized。

例如:
Socket socket;
线程A:
while (socket.isConnected) {
    line =    socket.readLine();
    if (line = "HTTP 200 OK") 
      //.....
   if (line = "$") 
     // .....
}
线程 B:
socket.write("request");
// 此时服务器有返回的话,可能已经被线程A读取走了!所以不能简单地直接用 socket.readLine()在这里读取,但是有的时候我们又需要服务器返回的数据包进行处理,该怎么办?
答案:
Socket: socket;
Object: lock = new Object();
String Response;

Thread A:
while (socket.isConnected) {
    response = readLine();
    synchronized (lock) {
      lock.notify();
    }
}
Thead B:
public void setup() {
    socket.write("Blabla");
    synchronized (lock) {
      lock.wait();
    }
    if (response == "Awesome")
      Log.i("gogogo", "大哥你来了");
}