乐趣区

关于java:JAVA并发编程Callable接口简介和使用

1.Callable 接口简介

2.FutureTask 类简介

3.Callable 接口应用

1.Callable 接口简介
在介绍 Callable 接口之前,咱们先回顾一下咱们很相熟的 Runnable 接口:
咱们想要应用线程的时候,很多时候都是先实现 Runnable 接口,而后重写 run 办法,如下所示:

public class RunnableDemo implements Runnable {
    @Override
    public void run() {}
}

不难发现,咱们始终应用的 Runnable 接口的 run 办法,是没有返回值的,如果咱们当初有一个场景要应用多线程,并且须要有返回值怎么办?
此时,咱们就引出有返回值的线程接口,Callable!

Callable: 返回线程执行的后果并且可能抛出异样的线程类!

这么说可能比拟形象,咱们应用代码示例,就能够一下子就看明确了!

public class CallDemo implements Callable<Integer> {// 泛型类

    @Override
    public Integer call() throws Exception { // 泛型类为返回值
        return null;
    }

}

当初咱们看到这个代码示例就应该霎时明确了,传入泛型类,那么 call 办法的返回值也会和泛型类。

好了,当初咱们领有 callable 接口了,然而如何应用呢?难道和 Runnable 接口一样,也是传入 Thread()类吗?

咱们从 jdk8 翻阅一下 api 字典 java api,发现并没有 callable 接口的传入参数,难道这是 java 的失误吗?

咱们应用适配器模式的思维,如果有个类,同时能够将 Runnable 接口和 Callable 接口进行整合,是不是就满足咱们这个需要了呢?

没错,是有这品种,它就是 FutureTask 类!可能提供返回值的异步计算!

2.FutureTask 类简介
FutureTask,一个可取得返回值的异步计算类!能够调用办法去开始和勾销一个计算,能够查问计算是否实现并且获取计算结果,只有当计算实现时能力获取到计算结果,否则就会阻塞!

3.Callable 接口应用
可能看了上述解说,咱们还是不晓得如何应用,接下来咱们间接用一个 Demo 来进行示例:
咱们先设定一个类,通过三秒中之后返回一个数值,代表计算过程。

public class CallableDemo implements Callable<Integer> {

    // 和 runnable 的接口比起来,这是有返回值的接口
    // 还能够抛异样
    @Override
    public Integer call() throws Exception {System.out.println(Thread.currentThread().getName() + "**** 进入 callable 了!");
        Thread.sleep(3000);
        return 1024;
    }
  }

接下来咱们将用 FutureTask 获取这个运算后果:

        // 把实现 callable 的接口当做参数传入 futuretask
        FutureTask<Integer> futureTask = new FutureTask<>(new CallableDemo());
        // 因为 futureTask 实现了 Runnable 接口,像一般的 Runnable 实现类一样传入 Thread 就能够了
        Thread t1 = new Thread(futureTask, "t1");
        // 失常启动
        t1.start();
        // 尝试获取返回后果
        System.out.println("****** result=" + futureTask.get()); 

最终计算结果:

依据正文,Future 能够很容易地就被应用了。

然而如果咱们批改一下代码呢?

        // 把实现 callable 的接口当做参数传入 futuretask
        FutureTask<Integer> futureTask = new FutureTask<>(new CallableDemo());
        // 因为 futureTask 实现了 Runnable 接口,像一般的 Runnable 实现类一样传入 Thread 就能够了
        Thread t1 = new Thread(futureTask, "t1");
        // 让两个雷同的线程同时执行 futureTask
        Thread t2 = new Thread(futureTask, "t2");
        // 失常启动
        t1.start();
        t2.start();
        // 尝试获取返回后果
        System.out.println("****** result=" + futureTask.get()); 

运行后果为:

看,还是和方才一样,也就是说一个 FutureTask 只能绑定一个 Thread!绑定多了也是有效的!

总结:
Callable 是一种能够领有返回值的线程类。
长处:
能够取得工作执行返回值;
通过与 Future 的联合,能够实现利用 Future 来跟踪异步计算的后果。

退出移动版