Java 如何把异步调用模拟成同步调用
2009-04-24 13:55
281 查看
在某些时候,需要把异步调用模拟成同步调用的形态。例如,基于基于异步通信的客户端需要同步调用。 :-)
要实现这个转换,可以有多种实现方法:
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!");
}
}
}
要实现这个转换,可以有多种实现方法:
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!");
}
}
}
相关文章推荐
- java---同步调用与异步调用对比
- java 同步调用第三方sdk提供异步监听方法
- java的同步调用、回调和异步调用。
- 简单解析三种JAVA调用方式-同步,异步,回调
- 如何将异步调用转换成同步调用
- iOS开发-如何用GCD同步若干个异步调用?
- 如何用GCD同步若干个异步调用
- java 三种调用机制(同步、回调、异步)
- 如何异步调用一个java方法,
- 使用递归算法将批量调用异步处理转化为同步调用,并使用Java模拟ExtJs异步处理同步化(续)
- 在同步方法中调用异步方法时如何避免死锁问题
- thrift java多线程非阻塞同步/异步调用实例
- 如何用Java回调和线程实现异步调用
- java 回调函数同步、异步调用
- java常见的几种调用机制(同步调用,异步调用,回调)
- 如何将同步调用转换成异步调用
- 使用递归算法将批量调用异步处理转化为同步调用,并使用Java模拟ExtJs异步处理同步化
- Java线程的同步和异步的区别
- 如何调用有道翻译API(Java,HTTP)
- 如何在Java客户端调用RESTful服务