java 三种调用机制(同步、回调、异步)

java中存在三种调用机制

1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用
2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
3:异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口
具体说来:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,

实例1:使用java中Timer来在给定时间间隔发送通知,每隔十秒打印一次数据

TimePrinter 实现ActionListener接口,该接口中的actionPerformed方法就是回调函数

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
/**
 *TimePrinter实现回调函数接口
 */
public class TimePrinter implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent event) {
        // TODO Auto-generated method stub
        Date now=new Date();
        System.out.println("Now time is "+now);
        Toolkit.getDefaultToolkit().beep();
    }

}

测试端

import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import javax.swing.Timer;

public class TimerTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ActionListener listener=new TimePrinter();
        Timer timer=new Timer(10000, listener);
        timer.start();
        JOptionPane.showMessageDialog(null, "quit");
        System.exit(0);
    }

}

运行结果:每隔10s打印,运行程序后需要耐心等待。

Now time is Fri Apr 15 22:31:53 CST 2016
Now time is Fri Apr 15 22:32:03 CST 2016
Now time is Fri Apr 15 22:32:13 CST 2016

从结果发现Timer每隔10s中回调listener中的方法。

实例2:老师平时学生布置任务后不可能一直等待和监督学生完成,老师通常会告诉学生,任务完成后给他打个电话或者发个信息,那么学生给老师返回结果的过程需要老师信息,这就是一个回调的过程。

public interface Callback {

    public void taskResult(String name);
}
/**
 * 学生必须指导老师的信息,才能回报任务情况,因此它必须实现回调接口
 *
 */
public class Teacher implements Callback{

    @Override
    public void taskResult(String name) {
        // TODO Auto-generated method stub
        System.out.println("任务:"+name+"完成");
    }

}
public class Student {
    Callback callback=null;
    //将老师的联系信息给学生
    public void setCallback(Callback callback)
    {
        this.callback=callback;
    }
     public void doTask()
     {
         for(int m=1;m<6;m++)
         {
             callback.taskResult(m+"是张三");
         }
     }
}

测试端:

public class CallbackTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Student student=new Student();
        student.setCallback(new Teacher());
        student.doTask();
    }

}

运行结果:

任务:1是张三完成
任务:2是张三完成
任务:3是张三完成
任务:4是张三完成
任务:5是张三完成
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到网络请求时,同步调用异步调用可以用以下示例来说明: 1. 同步调用示例: 假设我们需要通过网络请求获取某个网站的数据,并将其打印出来。在同步调用中,代码会在发送请求后等待响应返回后再继续执行。 ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; public class SyncExample { public static void main(String[] args) { try { // 创建URL对象 URL url = new URL("https://example.com"); // 打开连接并获取输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); // 读取数据并打印 String line; while ((line = reader.readLine()) != null) { System.out.println(line); } // 关闭连接 reader.close(); } catch (IOException e) { e.printStackTrace(); } // 其他代码... } } ``` 在这个示例中,`url.openStream()` 是一个同步调用,它会阻塞代码的执行直到数据完全加载并返回。 2. 异步调用示例: 现在我们使用异步调用来实现相同的功能。在异步调用中,代码会在发送请求后继续执行,不会等待响应的返回。 ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.concurrent.CompletableFuture; public class AsyncExample { public static void main(String[] args) { // 创建URL对象 URL url; try { url = new URL("https://example.com"); // 使用CompletableFuture来进行异步请求 CompletableFuture.supplyAsync(() -> { try { // 打开连接并获取输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); // 读取数据并返回 StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } // 关闭连接 reader.close(); return response.toString(); } catch (IOException e) { e.printStackTrace(); } return null; }).thenAccept(response -> { // 异步操作完成后执行的回调,打印响应结果 System.out.println(response); }); } catch (IOException e) { e.printStackTrace(); } // 其他代码... } } ``` 在这个示例中,我们使用了`CompletableFuture`来进行异步请求。`url.openStream()` 被包装在一个异步任务中,当任务完成后会调用 `thenAccept` 方法指定的回调函数来处理响应结果。这样,在请求发送后,代码会立即继续执行,不会等待响应返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值