Java可调用

时间:2020-01-09 10:36:26  来源:igfitidea点击:

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接口,因为它们都代表一个任务,该任务打算由一个单独的线程同时执行。

JavaCallableRunnable的不同之处在于Runnable接口的run()方法不返回值,并且它不能抛出已检查的异常(仅RuntimeExceptions)。

此外," Runnable"最初是为长时间运行的并发执行而设计的,例如同时运行网络服务器,或者监视目录中是否有新文件。 " Callable"界面更适合一次性任务返回单个结果。