「java怎么开启异步请求」异步请求的几种方法

博主:adminadmin 2022-11-30 17:55:09 174

今天给各位分享java怎么开启异步请求的知识,其中也会对异步请求的几种方法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java常见的几种调用机制(同步调用,异步调用

1、同步调用

同步调用是最基本的调用方式,对象b中的方法直接调用对象a的方法,这个时候程序会等待对象a的方法执行完返回结果之后才会继续往下走。

代码如下:

public class A {

public void methodA()

{

System.out.println("this is class A method");

}

}

public class B {

public void methodB()

{

A a = new A();

a.methodA();

System.out.println("this is class B method");

}

}

public class Test {

public static void main(String[] args) {

B b = new B();

b.methodB();

}

}

结果:

this is class A method

this is class B method

2、异步调用

对象b中的方法调用对象a的方法,程序并不需要等待对象a的方法返回结果值,直接继续往下走。

代码如下:

public class A extends Thread{

@Override

public void run() {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("this is class A method");

}

}

public class B {

public void methodB()

{

A a = new A();

a.start();

System.out.println("this is class B method");

}

}

public class Test {

public static void main(String[] args) {

B b = new B();

b.methodB();

}

}

结果:

this is class B method

this is class A method

说明:异步调用我们通常采用多线程的方法来达到目的

3、回调

对象a的方法methodA()中调用对象b的methodB()方法,在对象b的methodB()方法中反过来调用对象a的callBack()方法,这个callBack()方法称为回调函数,这种调用方法称为回调。

代码如下:

public class A {

public void methodA()

{

B b = new B();

b.methodB(new A());

System.out.println("this is class A method : methodA");

}

public void callBack()

{

System.out.println("this is class A method : callBack");

}

}

public class B {

public void methodB(A a)

{

System.out.println("this is class B method : methodB");

a.callBack();

}

}

public class Test {

public static void main(String[] args) {

A a = new A();

a.methodA();

}

}

运行结果:

this is class B method : methodB

this is class A method : callBack

this is class A method : methodA

注意:这里如果为了代码的扩展性更好,可以把类A与类B抽象出一个接口出来,然后用实现类去实现着两个接口,这样代码的扩展性会更好,也能满足更多的业务场景。

回调的核心在于:回调方将本身对象传给调用方,调用方在本身代码逻辑执行完之后,调用回调方的回调方法。

java 异步发送短信,异步怎么实现

java 异步发送短信,异步实现:

1,使用spring框架的异步注解 @Async ,底层应该是一个线程。

2,简单粗暴的方式:开一个线程

new Thread(new Runnable() {

public void run() {

//发送短信

}

}).start();

当然也可以高级一点,使用线程池。

3,更高端一点:使用消息队列MQ

如何用Java回调和线程实现异步调用

软件模块之间的调用关系可以分为两大类:即同步调用和异步调用。在同步调用中,一段代码(主调方)调用另一段代码(被调方),主调方必须等待这段代码执行完成返回结果后,才能继续往下执行,所以,同步调用是一种阻塞式调用,主调方代码一直阻塞等待直到被调方返回为止。同步调用相对比较直观,也是大部分编程语言直接支持的一种调用方式。但是,同步调用在处理比较耗时的情况下会严重影响程序性能,影响人机交互的瞬时反应。例如,某个程序需要访问数据库获取大量数据,然后根据这些数据进行一系列处理,将处理结果显示在程序主窗口。由于数据库访问和大量数据的处理都是耗时的工作,在这个工作完成之前,处理结果迟迟不能显示,用户点击鼠标也不会立即得到响应,让用户感到整个程序显得很沉重。面对这样一些需要比较长时间才能完成的应用场景,我们需要采用一种非阻塞式调用方式,即异步调用方式

java 异步调用方法

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方法来进行唤醒。注意,和大家认知的一样,这里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关于异步请求http接口

异步请求,那就是开启一条线程来发个http请求

等这条线程得到数据后,再通知主线程

android上的话,就有一个异步任务AnsyTask就是用来处理异步任务了

java的同步异步机制

基本概念:

每个Object都会有1个锁.

同步就是串行使用一些资源.

(说明:以下有些例子为了突出重点,省略了不必要的代码.非凡是省掉了一些成员变量,就是需要同步的对象.)

1. 多线程中对共享、可变的数据进行同步.

对于函数中的局部变量没必要进行同步.

对于不可变数据,也没必要进行同步.

多线程中访问共享可变数据才有必要.

2. 单个线程中可以使用synchronized,而且可以嵌套,但无意义.

class Test {

public static void main(String[] args) {

Test t = new Test();

synchronized(t) {

synchronized(t) {

System.out.println("ok!");

}

}

}

}

3. 对象实例的锁

class Test{

public synchronized void f1(){

//do something here

}

public void f2(){

synchronized(this){

//do something here

}

}

}

上面的f1()和f2()效果一致, synchronized取得的锁都是Test某个实列(this)的锁.

比如: Test t = new Test();

线程A调用t.f2()时, 线程B无法进入t.f1(),直到t.f2()结束.

作用: 多线程中访问Test的同一个实例的同步方法时会进行同步.

java怎么开启异步请求的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于异步请求的几种方法、java怎么开启异步请求的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-30,除非注明,否则均为首码项目网原创文章,转载请注明出处。