1、asynchronous call(异步调用)一个可以无需等待被调用函数的返回值就让操作继续进行的方法中文名异步调用外文名asynchronous call领域函数杰作线程。
2、快速导航实战用法异步调用使用方法举例异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你就去做别的了。
【资料图】
3、同步调用就是你 喊 你朋友吃饭 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你们一起去。
4、实战用法操作系统发展到今天已经十分精巧,线程就是其中一个杰作。
5、操作系统把 CPU 处理时间划分成许多短暂时间片,在时间 T1 执行一个线程的指令,到时间 T2又执行下一线程的指令,各线程轮流执行,结果好象是所有线程在并肩前进。
6、这样,编程时可以创建多个线程,在同一期间执行,各线程可以“并行”完成不同的任务。
7、在单线程方式下,计算机是一台严格意义上的冯·诺依曼式机器,一段代码调用另一段代码时,只能采用同步调用,必须等待这段代码执行完返回结果后,调用方才能继续往下执行。
8、有了多线程的支持,可以采用异步调用,调用方和被调方可以属于两个不同的线程,调用方启动被调方线程后,不等对方返回结果就继续执行后续代码。
9、被调方执行完毕后,通过某种手段通知调用方:结果已经出来,请酌情处理。
10、1. 使用wait和notify方法这个方法其实是利用了锁机制,直接贴代码: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("主线程内容"); } }可以看到在发起调用后,主线程利用wait进行阻塞,等待回调中调用notify或者notifyAll方法来进行唤醒。
11、注意,和大家认知的一样,这里wait和notify都是需要先获得对象的锁的。
12、在主线程中最后我们打印了一个内容,这也是用来验证实验结果的,如果没有wait和notify,主线程内容会紧随调用内容立刻打印;而像我们上面的代码,主线程内容会一直等待回调函数调用结束才会进行打印。
13、没有使用同步操作的情况下,打印结果:发起调用 调用返回 主线程内容 得到结果 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("主线程内容"); } }基本上和方法一没什么区别,只是这里使用了条件锁,两者的锁机制有所不同。
本文到此分享完毕,希望对大家有所帮助。