java代码如何实现异步 java异步函数

java 异步调用方法【java代码如何实现异步 java异步函数】1. 使用wait和notify方法
这个方法其实是利用了锁机制java代码如何实现异步,直接贴代码:
public class Demo1 extends BaseDemo{ private final Object lock = new Object(); @Override public void callback(long response) { System.out.println("得到结果"); System.out.println(response); System.out.println("调用结束"); synchronized (lock) { lock.notifyAll(); } } public static void main(String[] args) { Demo1 demo1 = new Demo1(); demo1.call(); synchronized (demo1.lock){ try { demo1.lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("主线程内容"); } }
可以看到在发起调用后java代码如何实现异步,主线程利用wait进行阻塞,等待回调中调用notify或者notifyAll方法来进行唤醒 。注意,和大家认知的一样 , 这里wait和notify都是需要先获得对象的锁的 。在主线程中最后我们打印了一个内容,这也是用来验证实验结果的,如果没有wait和notify,主线程内容会紧随调用内容立刻打印;而像我们上面的代码,主线程内容会一直等待回调函数调用结束才会进行打印 。
没有使用同步操作的情况下,打印结果:发起调用 调用返回 主线程内容 得到结果 1 调用结束
而使用了同步操作后:
发起调用 调用返回 得到结果 9 调用结束 主线程内容2. 使用条件锁
和方法一的原理类似:
public class Demo2 extends BaseDemo { private final Lock lock = new ReentrantLock(); private final Condition con = lock.newCondition(); @Override public void callback(long response) { System.out.println("得到结果"); System.out.println(response); System.out.println("调用结束"); lock.lock(); try { con.signal(); }finally { lock.unlock(); } } public static void main(String[] args) { Demo2 demo2 = new Demo2(); demo2.call(); demo2.lock.lock(); try { demo2.con.await(); } catch (InterruptedException e) { e.printStackTrace(); }finally { demo2.lock.unlock(); } System.out.println("主线程内容"); } }
基本上和方法一没什么区别 , 只是这里使用了条件锁,两者的锁机制有所不同 。
Java多线程实现异步调用 在JAVA平台 实现异步调用java代码如何实现异步的角色有如下三个角色:调用者 提货单 真实数据一个调用者在调用耗时操作 不能立即返回数据时 先返回一个提货单 然后在过一断时间后凭提货单来获取真正java代码如何实现异步的数据 去蛋糕店买蛋糕 不需要等蛋糕做出来(假设现做要很长时间) 只需要领个提货单就可以java代码如何实现异步了(去干别的事情) 等到蛋糕做好java代码如何实现异步了 再拿提货单取蛋糕就可以java代码如何实现异步了 public class Main { public static void main(String[] args) {
System out println( main BEGIN );
Host host = new Host();
Data data = https://www.04ip.com/post/host request( A );
Data data = https://www.04ip.com/post/host request( B );
Data data = https://www.04ip.com/post/host request( C );
System out println( main otherJob BEGIN );
try {
Thread sleep( );
} catch (InterruptedException e) {
}
System out println( main otherJob END );
System out println( data = https://www.04ip.com/post/+ data getContent());
System out println( data = https://www.04ip.com/post/+ data getContent());
System out println( data = https://www.04ip.com/post/+ data getContent());
System out println( main END );
}
}
这里的main类就相当于 顾客 host就相当于 蛋糕店 顾客向 蛋糕店 定蛋糕就相当于 发请求request 返回的数据data是FutureData的实例 就相当于提货单 而不是真正的 蛋糕 在过一段时间后(sleep一段时间后) 调用data getContent() 也就是拿提货单获取执行结果

推荐阅读