1 Java程序调用的方式
程序设计过程中很多情况下会涉及到不同模块之间相互调用,这种调用往往分为三种方式进行:
- 同步调用
- 异步调用
- 回调
1.1 同步调用
同步调用是一种阻塞式单向调用,也是普通程序中最常见的调用方式,假设A函数中部分功能需要由B函数实现,在A函数的某个地方调用了B函数,那么就需要等待B函数执行完毕后,才能继续执行A函数。
这种调用方式仅适用于B函数执行时间不长的情况,若B函数出现了长时间阻塞的情况,就会导致整个程序的阻塞。
1.2 异步调用
异步调用是一种类似于消息或事件的机制,是为了解决同步调用中阻塞的情况,当A方法中调用了B方法,不必等待B方法执行完成才运行A方法剩余部分,而是通过一种监听机制(Future+Callable,多线程部分)对B的执行结果进行监听。
1.3 回调
回调是一种双向调用机制,举例来说,A类中的方法A1调用了B类中的方法B1解决某个问题,当解决完毕后,B类中再反过来调用A类的方法A2(回调方法)来通知A类问题已经解决了。
回调也分为同步和异步,区别在于是否需要等待B类的方法返回结果给A类后,A类方法再执行剩余部分的功能。
2 定时器与监听器
Java核心思想卷1 第10版给出了一个回调接口的示例,构造一个定时器Timer,每隔固定时间间隔,执行一个操作。
java.swing.Timer对象构造器传入时间间隔和监听器对象,java.awt.event定义了ActionListener接口,监听器对象应该实现该接口,并重写执行时间函数actionPerformed(ActionEvent event)。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
public class TimerTest {
public static void main(String[] args)
{
ActionListener listener = new TimePrinter();
Timer t = new Timer(10000,listener);
t.start();
JOptionPane.showMessageDialog(null,"Quit Program?");
System.exit(0);
}
}
class TimePrinter implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("At the tone, the time is " + new Date());
Toolkit.getDefaultToolkit().beep();
}
}