Java可调用
Java的Callable接口java.util.concurrent.Callable表示一个异步任务,该任务可以由单独的线程执行。例如,可以向Java ExecutorService提交一个" Callable"对象,该对象随后将异步执行该对象。
Java可调用接口定义
Java的Callable接口非常简单。它包含一个名为call()
的方法。以下是" Callable"界面的外观(大致):
public interface Callable<V> { V call() throws Exception; }
调用call()方法以执行异步任务。 call()方法可以返回结果。如果任务是异步执行的,则结果通常会通过Java Future传播回任务的创建者。当将" Callable"提交给" ExecutorService"进行并发执行时就是这种情况。
如果任务在执行过程中失败,call()
方法也可能抛出" Exception"异常。
实现可调用
这是一个实现JavaCallable
接口的简单示例:
public class MyCallable implements Callable<String> { @Override public String call() throws Exception { return String.valueOf(System.currentTimeMillis()); } }
此实现非常简单。它具有设置为Java String的通用类型。结果是call()
方法将返回一个String。 call()
实现只是返回当前时间的String表示(以毫秒为单位)。在实际的应用程序中,任务可能是一组更复杂或者更大型的操作。
IO操作(例如从磁盘或者网络读取或者写入磁盘或者网络)通常是可以同时执行的任务的理想选择。 IO操作在读取和写入数据块之间通常需要很长的等待时间。通过在单独的线程中执行此类任务,可以避免不必要地阻塞主应用程序线程。
可调用与可运行
JavaCallable
接口类似于JavaRunnable
接口,因为它们都代表一个任务,该任务打算由一个单独的线程同时执行。
JavaCallable
与Runnable
的不同之处在于Runnable
接口的run()
方法不返回值,并且它不能抛出已检查的异常(仅RuntimeException
s)。
此外," Runnable"最初是为长时间运行的并发执行而设计的,例如同时运行网络服务器,或者监视目录中是否有新文件。 " Callable"界面更适合一次性任务返回单个结果。