一、JDK中的future

Future类表示异步计算的未来结果 - 这个结果最终将在处理完成后出现在Future中.

Future接口是长时间运行方法异步处理的理想选择。这使我们能够在等待Future封装的任务完成时执行一些其他事情。

创建一个Callable实例并没有把我们带到任何地方,我们仍然必须将这个实例传递给一个执行器,该执行器将负责在一个新线程中启动该任务并返回有价值的Future对象。这就是ExecutorService的用武之地,ExecutorService大部分都是由实用程序类Executors的静态工厂方法提供的。

一旦我们有了一个ExecutorService对象,我们只需要调用submit()传递我们的Callable作为参数。submit()将负责启动任务并返回FutureTask 对象,该对象是Future接口的实现。

future的主要方法:

Future.isDone()告诉我们执行程序是否已完成任务处理。如果任务完成,则返回 true,否则返回 false。
从计算中返回实际结果的方法是Future.get()。请注意,此方法会阻止执行,直到任务完成.所以配合isDone()方法实现非阻塞的任务处理方式.

重载了get()方法get(long,TimeUnit),get(long,TimeUnit)和get()之间的区别在于,如果任务在指定的超时时间之前没有返回,前者将抛出TimeoutException.

二、如何使用?

在连接到nats时候,创建了reader和writer两个线程,这两个线程对象中包含更加底层的数据传输连接socket,在完成socket级别连接时候,使用了future模式返回连接结果对象.

1.从连接nats的开始,调用conn.connect(reconnectOnconnect),在该方法中调用了tryToConnect方法.

image.png
image.png

2.在阅读tryToConnect方法,找到下面代码,剩下代码可自行理解.

第一确认reader和writer停止;
第二通过option生成DataPort对象,调用connect方法完成底层socket数据传输连接;
第三调用start()启动reader和writer线程,传入dataPort对象.
image.png
image.png

3.上面截图中有这样一行代码connection.getExecutor().submit(this, Boolean.TRUE)

给connection对象中的线程池中添加执行reader和writer的线程,用于完成数据写入和数据读取.
this指代当前reader和writer线程对象,其run方法(以reader的代码为例):
1.dataPortFuture的get()获取结果,返回dataPort对象
2.dataPort调用read方法,读取nats消息
3.循环处理消息:放入队列等

reader的run方法
image.png
writer的run()方法:
image.png