Callable接口探究-阿里云开发者社区

开发者社区> javaedge> 正文

Callable接口探究

简介: Callable接口探究
+关注继续查看

一种具有类型参数的泛型,类型参数表示的是从call()中返回的值)

创建接口的思路

1)创建Callable实现类+重写call;

2)借助执行调度服务ExecutorService,获取Future对象:

-ExecutorService ser = Executors。newFixedThreadpool(2);

-Future result = ser.submit(实现类对象)

3)获取值result.get()

4)停止服务ser.shutdownNow()

(通常跟ExecutorService配合使用)

public class Callabletest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建线程
        ExecutorService ser = Executors.newFixedThreadPool(1);
        Race race = new Race();
        //获取值
        Future<Integer> result = ser.submit(race);
        int num = result.get();
        System.out.println(num);
        ser.shutdown();
    }
}


class Race implements Callable<Integer> {
    private String name;
    public Integer call() throws Exception {
        return 1000;
    }

这种方式创建线程优点:

1)可以获取返回值

2)可以对外申明异常

Callable和Future的关系:

Callable接口代表了一段可以被线程执行的代码,而Future接口用于接收或是控制查看该线程的结果或是过程。Callable用于产生结果,而Future用于接受结果。Callable接口使用泛型去定义它的返回类型,Future也使用泛型去接收它的接收类型。Executors类提供了一些有用的方法在线程池中执行Callable内的任务。由于Callable任务是并行的(并行就是整体看上去是并行的,其实在某个时间点只有一个线程在执行),我们必须等待它返回的结果。 Java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它可以知道Callable任务的状态和得到Callable返回的执行结果。Future提供了get()方法让我们可以等待Callable结束并获取它的执行结果。


一、Runnable(interface)

public interface Runnable {

public void run();

}

run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。

二、Callable (interface)

public interface Callable {

V call() throws Exception;

}

与 Runnable 不同的是call()函数返回的类型就是传递进来的V类型,而且能够抛出异常。一般情况下是配合ExecutorService来使用的

三、Future( interface)

Future是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果、设置结果操作。


public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

cancel方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。

isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。

isDone方法表示任务是否已经完成,若任务完成,则返回true;

get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

也就是说Future提供了三种功能:

判断任务是否完成;

能够中断任务;

能够获取任务执行结果。


四.ExecutorService

必须使用ExecutorService.submit()方法调用

提供了三种重载的submit方法如下(第二种不常用):

Future submit(Callable task);

//提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。

Future submit(Runnable task, T result);

//提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。

Future

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8661 0
Java基础-23总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:多线程(理解) (1)多线程:一个应用程序有多条执行路径 进程:正
2779 0
多线程——继承Thread 类和实现Runnable 接口的区别
  java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点:   首先,java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了。
1381 0
JAVA多线程学习Runnable接口
JAVA不允许一个类继承自多个类,为了解决这个问题,JAVA提供了java.lang.Runnable接口,它有一个run()方法: 1 package runimpl; 2 public class Machine implements Runnable{ 3 private ...
477 0
如何使用IPortable接口?
DNN编译出错: Description: An error occurred during the compilation of a resource required to service this request.
703 0
+关注
javaedge
关注公众号:JavaEdge,后台回复面试,领取更多大厂求职资源。曾在百度、携程、华为等大厂搬砖,专注Java生态各种中间件原理、框架源码、微服务、中台等架构设计及落地实战,只生产硬核干货!
2317
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载