java.util.concurrent包
java.util.concurrent包提供了用于支持Future模式的类和接口。
java.util.concurrent.Callable接口将“返回值的某种处理的调用”抽象化了。Callable接口声明了call方法。call方法与Runnable接口的run方法相似,不同的是call方法有返回值。
java.util.concurrent.Future接口相当于Future角色。Future接口声明了用于获取值的get方法,但并没有声明设置值的方法。设置值的方法需要在实现Future接口的类中声明。除了get方法外,Future接口还声明了用于中断运行的cancel方法。
java.util.concurrent.FutureTask类是实现了Future接口的标准类。FutureTask类声明了用于获取值的get方法、用于中断运行的cancel方法、用于设置值的set方法,以及用于设置异常的setException方法。此外,由于FutureTask类还实现了Runnable接口,所以它还声明了run方法。
在创建FutureTask类的实例时,Callable对象会被传递给构造函数的参数。之后,如果线程调用FutureTask的run方法,那么在构造函数中接收到的参数——Callable对象的call方法就会被执行。换言之,调用FutureTask的run方法的线程也会调用call方法。
调用call方法的线程会同步地获取call方法的返回值,然后通过FutureTask的set方法来设置该返回值。如果call方法中发生了异常,则调用call方法的线程就会调用FutureTask的setException方法设置异常。
再然后,只要根据需要,调用FutureTask的get方法去获取值,就可以获取call方法的返回值。其中,get方法无论由哪个线程调用都可以。
使用java.util.concurrent包
Host.java
1 | import java.util.concurrent.Callable; |
FutureData.java
1 | import java.util.concurrent.Callable; |