Callable接口

面试:获得多线程的方法有几种?

  1. 传统的继承 Thread类。

  2. 实现 Runnable 接口。

  3. Java5 以后又有实现 Callable接口和 java线程池获得。

Callable接口_第1张图片

 

 

Callable接口介绍:

(1)java.util.concurrent.Callable是一个泛型接口,只有一个call()方法

(2)call()方法抛出异常Exception异常,且返回一个指定的泛型类对象

面试题:callable接口与runnable接口的区别?

(1)是否有返回值。 (2)是否抛异常。 (3)落地方法不一样,一个是run,一个是call。

Callable接口实现多线程的应用场景:

(1)当父线程想要获取子线程的运行结果时。

使用Callable接口实现多线程的步骤:

(1)第一步:创建Callable子类的实例化对象。

(2)第二步:创建FutureTask对象,并将Callable对象传入FutureTask的构造方法中。

(注意:FutureTask实现了Runnable接口和Future接口)

这像认识一个不认识的同学,我可以找中间人介绍。 中间人是什么?java多态,一个类可以实现多个接口!!

   (3)第三步:实例化Thread对象,并在构造方法中传入FurureTask对象

   (4)第四步:启动线程

        FutureTask ft = new FutureTask(new MyThread());

        new Thread(ft, "AA").start();

代码演示:

package juc;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 *  面试:实现多线的方法有几种?
 *
 * 多线程中 第 3 种获得多线程的方式
 */
public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask = new FutureTask(new MyThread());
        new Thread(futureTask,"A").start();
        new Thread(futureTask,"B").start();
        System.out.println(futureTask.get());
    }
}
class MyThread implements Callable{

    @Override
    public Integer call() throws Exception {
        System.out.println("come in here");
        return 1024;
    }
}

直接替换runnable是否可行?

  不可行,因为:thread类的构造方法根本没有Callable。

Callable接口_第2张图片

 

 

运行成功后如何获得返回值?

ft.get();

 

FutureTask

  未来的任务,用它就干一件事,异步调用main方法就像一个冰糖葫芦,一个个方法由main串起来。但解决不了一个问题:正常调用挂起堵塞问题。

例子:

(1)老师上着课,口渴了,去买水不合适,讲课线程继续,我可以单起个线程找班长帮忙买水, 水买回来了放桌上,我需要的时候再去get。

(2)4个同学,A算1+20,B算21+30,C算31*到40,D算41+50,是不是C的计算量有点大啊, FutureTask单起个线程给C计算,我先汇总ABD,最后等C计算完了再汇总C,拿到最终结果

(3)高考:会做的先做,不会的放在后面做

你可能感兴趣的:(Callable接口)