高级 Java 面试必问的三大 IO 模型,你 get 了吗?

高级 Java 面试必问的三大 IO 模型,你 get 了吗?_第1张图片

 

问题 14

不管你平时是否接触大量的 IO 网络编程,IO 模型都是高级 Java 工程师面试非常高频的一道题。你了解 Java 的 IO 模型吗?多路复用技术是什么?

我的答案

在了解 Java IO 模型之前,我们先来明确几个概念,初学者通常会被如下几个概念给误导:

同步和异步

同步指的是当程序在做一个任务的时候,必须做完当前任务才能继续做下一个任务,这是一种可靠有序的运行机制,假设当前任务执行失败了,可能就不会进行下一个任务了,往往在一些有依赖性的任务之间,我们使用同步机制。而异步恰恰相反,它不能保证有序性。程序在提交当前任务后,并不会等待任务结果,而是直接进行下一个任务,通常在一些任务之间没有依赖性关系的时候可以使用异步机制。

这么说可能还是有点抽象,我们举个例子来说吧。假设有 4 个数字 a, b, c, d,我们需要计算它们连续相除的结果。那么可以写这样一个函数:

public static int divide(int paraA, int paraB) {
  return paraA / paraB;
}

如上即为我们的方法,假设我们使用同步机制去做,程序会写成类似如下这样:

int tmp1 = divide(a, b);
int tmp2 = divide(tmp1, c);
int result = divide(tmp2, d);

此处假如我们定义了 4 个数字的值为如下:

int a = 1;
int b = 0;
int c = 1;
int d = 1;

这时候我们编写的同步机制的程序,tmp2 的计算需要依赖于 tmp1,result 又依赖于 tmp2,事实上计算 tmp1 的值时候即会发生除数为的 0 的异常 ArithmeticException。

我们也可以通过多线程来将这个程序转换为异步机制的方式去做,如下(我们不考虑整数进位造成的结果不同问题):

Callable cA = () -> divide(a, b);
FutureTask taskA = new FutureTask<>(cA);
new Thread(taskA).start();

Callable cB = () -> divide(c, d);
FutureTask taskB = new FutureTask<>(cB);
new Thread(taskB).start();

int tResult = taskA.get() /

你可能感兴趣的:(java,学习,阅读,java,面试,开发语言)