在某些时候,需要把异步调用模拟成同步调用的形态。例如,基于基于异步通信的客户端需要同步调用。 :-)
要实现这个转换,可以有多种实现方法:
1。很常用的方法,应用循环机制:
boolean flag = false;
public void methodA(){
System.out.println("Hello, waitting for response!");
while(!flag){
System.out.println("waitting.........");
try { Thread.sleep(1000); }
catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.prinln("Response handled........");
}
public void methodB(){
System.out.println("Get response!");
flag = true;
}
当响应线程收到响应信息后,就会调用methodB(),重设flag的值,以便methodA()可以退出循环,继续后面逻辑。
2。应用Object.wait()方法中断,等待通知。然后用Object.notify()或者Object.notifyAll()退出等待,继续逻辑
public class LockTest {
private Object locker = new Object();
private boolean flag = false;
/**
* Locking thread when it is invoked
*/
private void lock(){
try {
synchronized(this.locker){
locker.wait();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Unlocking thread which has been locked
*/
private void unLock(){
locker.notify();
}
/**
* remove binding locker
*/
public void update(){
this.flag = true;
synchronized(this.locker){
this.unLock();
}
}
/**
* test lock function
*/
public void test(){
System.out.println("Hello, this is testing for lock");
this.lock();
if(flag){
System.out.println("Testing is ok!");
}else{
System.out.println("Testing is failed!");
}
}
}